2017-02-07 5 views
2

Я новичок в MongoDB, и я пытаюсь найти документы в коллекции A, где поле _id равно полю excel_template из коллекции B.Найти документы в MongoDB, используя результат другого запроса

var r = db.B.find({"name":/.*aco.*/}, {excel_template:1, _id:0}).excel_template; 
db.A.find({"_id":{$eq: "${r}" }}) 

, но мне трудно это делать. Это не дает мне никаких результатов, пока он должен дать мне один результат. Любые предложения будут оценены

+0

'db.A.find ({«_ идентификатор»: { $ in: r}}) '? .. –

+0

' Can canonicalize query: BadValue $ in нуждается в массиве – Leukonoe

+0

и если вы 'var r = db.B.find ({" name ": /.* aco. * /}, {excel_template: 1, _id: 0}); db.A.find ({"_ id": {$ in: r.excel_template}}) '? .. –

ответ

5

find возвращает cursor в соответствующие документы. Таким образом, запрос

db.B.find({ "name": /.*aco.*/ }, { "excel_template": 1, "_id": 0 }) 

не вернет ни одного документа, но и cursor к документам, которые соответствуют критериям запроса выше.

Вы можете использовать метод distinct() возвращать массив excel_template значений из документов, которые соответствуют выше запрос и использовать его в другом запросе, как в:

var r = db.B.distinct("excel_template", { "name": /.*aco.*/ }); 
db.A.find({ "_id": { "$in": r } }); 

ИЛИ


MongoDB 3.2 и новее:

Вы также можете использовать структуру агрегации, где трубопровод $lookup обеспечит функциональность для объединения двух коллекций и выполнения запроса в одной операции

db.B.aggregate([ 
    { "$match": { "name": /.*aco.*/ } }, 
    { 
     "$lookup": { 
      "from": "A", 
      "localField": "excel_template", 
      "foreignField": "_id", 
      "as": "bList" 
     } 
    } 
])