在mongodb中知道数组元素的索引与运算符中的$匹配吗?

时间:2016-12-11 19:35:50

标签: mongodb mongoose aggregation-framework

我正在使用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"]
}

现在任何人都可以帮助我,这对我来说真是太棒了。

3 个答案:

答案 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"]}},
        ]
       }
   }])