我有一种情况,我必须根据请求从数组中提取多个值.
数据库中的事物状态:
{
"_id" : ObjectId("56fb8fdf5e3227c637891ca8"),
"description" : "Testing service",
"name" : "test-service",
"endpoints" : [
{
"uri" : "/api/test1",
"method" : "GET",
"description" : "test1",
"noAuthRequired" : true,
"allowedByDefault" : true,
"allowedRoles" : ['admin']
},
{
"uri" : "/api/test2",
"method" : "GET",
"description" : "test2",
"noAuthRequired" : true,
"allowedByDefault" : true,
"allowedRoles" : ['admin']
},
{
"uri" : "/api/test3",
"method" : "GET",
"description" : "test3",
"noAuthRequired" : true,
"allowedByDefault" : true,
"allowedRoles" : ['admin']
}
]
}
请求列出了我必须从数据库阵列中删除的多个端点. JSON请求的示例:
{
"endpoints": [{
"uri": "/api/test1",
"method": "GET"
},
{
"uri": "/api/test2",
"method": "POST"
}]
}
当此请求到来并被处理时,它应该使用URI / api / test1和方法GET删除端点.它不应该使用URI / api / test2删除端点,并且方法GET beacuse请求声明POST / api / test2应该被删除,并且因为它不存在于DB中,所以只有GET / api / test1被删除.
我尝试过这样做,使用Mongoose:
router.route('/services/:id/endpoints').delete(function(req, res) {
...
model.service.findOneAndUpdate({ '_id': req.params.id },
{ $pull: { 'endpoints': req.body.endpoints } },
function(err, srv) {
...
});
});
而这根本不起作用.
router.route('/services/:id/endpoints').delete(function(req, res) {
...
model.service.findOneAndUpdate({ '_id': req.params.id },
{ $pullAll: { 'endpoints': req.body.endpoints } },
function(err, srv) {
...
});
});
这没什么作用.
router.route('/services/:id/endpoints').delete(function(req, res) {
...
model.service.findOneAndUpdate({ '_id': req.params.id },
{ $pullAll: { 'endpoints': { $in: req.body.endpoints } } },
function(err, srv) {
...
});
});
这将删除DB中的所有端点,它不应该.
我已经决定使用异步:
var pullCalls = [];
req.body.endpoints.forEach(function(endpoint) {
pullCalls.push(function(callback) {
model.service.findOneAndUpdate({
'_id': req.params.id
}, {
$pull: {
'endpoints': {
'method': endpoint.method,
'uri': endpoint.uri
}
}
}, function(err, srv) {
if (err)
return callback(err);
callback(err, srv);
});
});
});
// TODO: try doing this without async in a single query
async.parallel(pullCalls, function(err, srv) {
if (err) {
res.status(500);
res.json({
'success': false,
'response': err
});
} else {
res.json({
'success': true,
'response': 'endpoints_removed'
});
}
});
这是有效的,但我想在单个mongoose查询中没有异步的情况下这样做.有办法吗?
谢谢 :)
最佳答案 你会讨厌这个,但是:
{ "$pull": { "endpoints": { "$or": req.body.endpoints } } }
会工作得很好.
$or
运算符期望数据格式与您提交的格式完全相同. $pull
已经开始研究阵列场元素.
当然$or
意味着“要么”,这基本上意味着“任何与这些条件相匹配的东西都需要被拉动”.
因此,只要req.body.endpoints实际上表示为您所说的数组,那么这实际上是$or
的正确参数