我正在使用mongoDB聚合现在我在这里面临一个问题,我试图通过使用$ in运算符来匹配我的输入数组中存在的文档。现在我想知道输入数组中的lement索引,现在任何人都可以告诉我该怎么做。
我的代码
var coupon_ids = ["58455a5c1f65d363bd5d2600", "58455a5c1f65d363bd5d2601","58455a5c1f65d363bd5d2602"]
couponmodel.aggregate(
{ $match : { '_id': { $in : coupons_ids }} },
/* Here i want to know index of coupon_ids element that is matched because i want to perform some operation in below code */
function(err, docs) {
if (err) {
} else {
}
});
Couponmodel Schema
var CouponSchema = new Schema({
category: {type: String},
coupon_name: {type: String}, // this is a string
});
UPDATE - 正如user3124885所建议的那样,聚合性能并不是更好,有谁能告诉我mongodb中聚合和普通查询之间的性能差异。哪个更好?
更新 - 我在SO mongodb-aggregation-match-vs-find-speed上读到了这个问题。在这里,用户自己评论说两者都花了相同的时间,也看到vlad-z回答我认为聚合更好。如果你们有人在mongodb上工作那么请告诉我你对此有何看法?
UPDATE - 我使用了包含30,000行的样本json数据并尝试与聚合v / s匹配查找聚合在180毫秒内执行,其中查询占用了220毫秒。另外我运行$ lookup它也花了不到500ms所以认为聚合比普通查询快一点。如果你们中的任何一个尝试使用聚合,请纠正我们,如果没有,那么为什么?
UPDATE -
我读过这篇文章,其中用户使用下面的代码作为$ zip SERVER-20163的替代,但我没有得到如何使用下面的代码解决我的问题。那么有人可以告诉我如何使用下面的代码来解决我的问题。
{$map: {
input: {
elt1: "$array1",
elt2: "$array2"
},
in: ["$elt1", "$elt2"]
}
现在任何人都可以帮助我,这对我来说真是太棒了。
答案 0 :(得分:1)
所以说我们在数据库集合中有以下内容:
> db.couponmodel.find()
{ "_id" : "a" }
{ "_id" : "b" }
{ "_id" : "c" }
{ "_id" : "d" }
我们希望在馆藏中搜索以下ID
var coupons_ids = ["c", "a" ,"z"];
然后我们必须构建一个动态投影状态,以便我们可以投影正确的索引,因此我们必须将每个id映射到其对应的索引
var conditions = coupons_ids.map(function(value, index){
return { $cond: { if: { $eq: ['$_id', value] }, then: index, else: -1 } };
});
然后我们可以将其注入我们的聚合管道
db.couponmodel.aggregate([
{ $match : { '_id' : { $in : coupons_ids } } },
{ $project: { indexes : conditions } },
{ $project: {
index : {
$filter: {
input: "$indexes", as: "indexes", cond: { $ne: [ "$$indexes", -1 ] }
}
}
}
},
{ $unwind: '$index' }
]);
运行上面的内容现在将输出每个_id及其在coupons_ids
数组中的相应索引
{ "_id" : "a", "index" : 1 }
{ "_id" : "c", "index" : 0 }
但是我们也可以在最后添加更多项目到管道,并引用$index
来获取当前匹配的索引。
答案 1 :(得分:0)
我认为您可以更快地完成检索数组并手动搜索。请记住,聚合不会为您提供性能。
答案 2 :(得分:0)
// $ match,$ in,$和
$match:{
$and:[
{"uniqueID":{$in:["CONV0001"]}},
{"parentID":{$in:["null"]}},
]
}
}])