在mongodb中使用聚合在查询匹配后执行更新

时间:2016-11-14 19:24:40

标签: mongodb mongoose

我正在编写mongodb查询,我在使用聚合,我的查询在下面给出

couponmodel.aggregate(
    { $match : { 'brand_id': { $in: brand_ids } } },
    { $project: { _id: 1, arr_size: { $size: "$coupon_codes" }, curr_ctr:1 } },
    function(err, docs) {
        if (err) {

        } else {
            if (docs.length > 0) {
                console.log('docs: ', docs);
            }
        }
    });
};

现在我遇到的问题是在匹配查询之后我想从我的brand_ids(这是一个数组)中删除(拉)这个brand_id,因为我想对剩余的brand_ids使用匹配查询

任何人都可以告诉我怎么做。

谢谢。

更新 - 我认为我没有明确提到我要做的事情,请考虑以下情况

假设我的brand_ids数组包含这些字符串

brand_ids = ["id1", "id2", "id3", "id4", "id5"] 

我的数据库有以下文件

{
   "brand_id": "id1",
   "name": "Levis",
   "loc": "india"
},
{
   "brand_id": "id1",
   "name": "Levis"
   "loc": "america"
},
{
   "brand_id": "id2",
   "name": "Lee"
   "loc": "india"
},
{
   "brand_id": "id2",
   "name": "Lee"
   "loc": "america"
}

所需的JSON输出

   {
       "name": "Levis"
    },
    {
       "name": "Lee"
    }

现在对于上面的查询我希望得到的结果只有一个" Levis"还有一个" Lee",但是当他们在文件中出现两次时,他们将被返回两次,这就是为什么当第一次" Levis"似乎我想从brand_ids中删除它,以便下一个" Levis"不会被退回,而#34; Lee"也是如此。我也这样做是为了减少查询时间,所以不要给我回答像品牌名称和所有的群组查询。

希望我的问题现在清楚了。

更新 - 正如任何人告诉我现在使用群组一样,让我告诉你为什么我认为它会增加查询所花费的时间。

对于上面的例子,假设我有25000个文件,其中"名称"作为" Levis"和25000个文件,其中" name"是" Lee",现在如果我将使用组,则将查询所有50000个文档并按" name"进行分组。

但根据我想要的解决方案,当第一份文件与" Levis"和" Lee"如果找到了,那么我将不必寻找剩下的数千份文件。

希望你明白,其实我的问题是如何在我的阵列的每个元素上使用findOne,当我得到任何元素时,不要寻找它。

2 个答案:

答案 0 :(得分:2)

仍然不能100%确定您正在尝试的内容,但这会创建一个长度为1的结果文档,其中包含brand_ids所有匹配项的不同值。

然后在结果中,它将遍历所有品牌并从brand_ids数组中删除它们。

couponmodel.aggregate(
    { $match: { "brand_id": { $in: brand_ids } } },
    { $group: { _id: null, brands: { $addToSet: "$brand_id" } } },
    function(err, doc) {
        doc.brands.forEach(function(brand) {
            var idx = array.indexOf(brand);
            if (idx > -1) {
                brand_ids.splice(idx, 1);    
            }
        });
    }
)

答案 1 :(得分:1)

试试这个

couponmodel.aggregate(
        { "$match" : { 'brand_id': { $in: brand_ids } } },
        { "$group": { _id: name, "name" : {"$first":"$name"}}},
        {"$project" : {name : "$name","_id" : false}},
        function(err, docs) {
            if (err) {
                console.error("Razor_pay_webhook Error 2 err: " + err);
                res.json({success : 0, message : "Sorry Please Try Again"});
                return next();
            } else {
                if (docs.length > 0) {
                    console.log('docs: ', docs);
                }
            }
        });
    };