如何按多个标准从数组中提取多个对象

时间:2016-03-30 10:43:32

标签: node.js mongodb mongoose mongodb-query

我遇到的情况是我必须根据请求从数组中提取多个值。

数据库中的事物状态:

select *
from (select *
      from <table>
      order by id asc)
where rownum <= 20

minus
select *
from (select *
      from <table>
      order by id asc)
where rownum <= 10

请求列出了我必须从数据库阵列中删除的多个端点。 JSON请求的示例:

{
    "_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']
        }
    ]
}

当此请求到来并被处理时,它应该使用URI / api / test1和方法GET删除端点。它不应该使用URI / api / test2删除端点,并且方法GET beacuse请求声明POST / api / test2应该被删除,因为它不存在于DB中,只有GET / api / test1被删除。

我尝试过这样做,使用Mongoose:

{
    "endpoints": [{
        "uri": "/api/test1",
        "method": "GET"
    },
    {
        "uri": "/api/test2",
        "method": "POST"
    }]
}

这根本不起作用。

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) {
        ...
    });
});

这将删除DB中的所有端点,它不应该。

我已经决定使用async:

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) {
        ...
    });
});

这样可行,但我想在单个mongoose查询中没有异步的情况下这样做。有办法吗?

谢谢:)

1 个答案:

答案 0 :(得分:1)

你会讨厌这个,但是:

{ "$pull": { "endpoints": { "$or": req.body.endpoints } } }

工作得很好。

$or运算符需要与您提交的格式完全相同的数据。 $pull本质上已经用于检查数组字段元素。

当然$or的意思是“或者”,它基本上转化为“任何符合这些条件的东西都需要被拉动”

因此,只要req.body.endpoints实际上表示为您所说的数组,那么这实际上是$or的正确参数