我有两个不同的集合,我正在尝试查询第一个集合,并将其输出作为第二个集合的输入。
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})
我的最终结果将是一个独特的用户列表。
答案 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()
会有所帮助。