我正在编写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,当我得到任何元素时,不要寻找它。
答案 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);
}
}
});
};