我有一种情况,我必须根据请求从数组中提取多个值. 数据库中的事物状态: { "_id" : ObjectId("56fb8fdf5e3227c637891ca8"), "description" : "Testing service", "name" : "test-service", "endpoints" : [ { "uri" : "/api/
数据库中的事物状态:
{ "_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
的正确参数