Mongo Shell使用另一个集合的结果查询一个集合

时间:2015-07-31 00:36:09

标签: mongodb shell mongodb-query

我有两个不同的集合,我正在尝试查询第一个集合,并将其输出作为第二个集合的输入。

var mycursor = db.item.find({"itemId":NumberLong(123)},{"_id":0})
var outp = "";
while(mycursor.hasNext()){    
    var rec = mycursor.next()
    outp = outp + rec.eventId;
}

这个查询工作正常,并返回一个eventIds列表。

我有另一个名为users的集合,其中包含eventId字段。 eventId可以在多个用户中重复。因此,对于每个eventId,我都会在上面的查询中获得用户列表。

我对第二个集合的查询将是这样的:

db.users.find({"eventId":ObjectdId("each eventId from above query")},{"_id":0})

我的最终结果将是一个独特的用户列表。

1 个答案:

答案 0 :(得分:1)

这应该基本上起作用(到了这一点):

db.events.find({ 
    "eventId": { "$in": db.item.find({ 
        "itemId":NumberLong(123)
    }).map(function(doc) { return doc.eventId }) }
})

甚至更好一点:

db.events.find({ 
    "eventId": { "$in": db.item.distinct("eventId",{ 
        "itemId":NumberLong(123) }) }
})

原因是"内部查询"在发送外部查询之前进行评估。因此,您将获得一组用于$in的参数。

这基本上与执行以下操作相同,后者在shell之外转换得更好:

var events = db.item.distinct("eventId",{ "itemId":NumberLong(123) });

db.events.find({ "eventId": { "$in": events } })

如果结果是"太大"然而,你最好的方法是循环初始结果,就像你已经完成的那样,并建立一个参数数组。一旦达到一定的大小,然后在"页面"中多次执行相同的$in查询。得到结果。

但寻找" ditinct" eventId通过.distinct().aggregate()会有所帮助。