node.js – 如何通过多个条件从数组中拉出多个对象

我有一种情况,我必须根据请求从数组中提取多个值.

数据库中的事物状态:

{
    "_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的正确参数

点赞