2015-07-31 4 views
0

У меня есть две разные коллекции, и я пытаюсь выполнить запрос к первой коллекции и вывести ее вывод в качестве входных данных во вторую коллекцию.Mongo Shell Запрос одной коллекции с результатами другой

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 может повторяться у нескольких пользователей. Поэтому для каждого события, которое я получаю в вышеуказанном запросе, я хочу также получить список пользователей.

Мой запрос для второй коллекции будет что-то вроде этого:

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

Мой окончательный результат будет уникальный список пользователей.

ответ

1

Whell это в основном должна работать (до такой степени, что есть):

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.

Это в основном так же, как делает следующее, что в переводе лучше за пределами оболочки:

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

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

Если результаты «слишком большой», однако, тогда ваш лучший подход заключается в цикле первоначальные результаты как вы уже сделали и создали массив аргументов. Как только на определенный размер, выполните один и тот же запрос $in несколько раз на «страницах», чтобы получить результаты.

Но ищет «ditinct» eventId через .distinct() или .aggregate() поможет.

Смежные вопросы