Итак, у меня есть два ObjectId
которые находятся в разных коллекциях, которые я хотел бы объединить в качестве вывода. Так что это похоже на использование функции $lookup
без каких-либо локальных полей. Без агрегата я мог бы просто сделать два .findOne
, но для этого потребовалось бы два вызова API (что привело бы к созданию двух соединений). Можно ли добиться этого за один раз?
Так что без агрегирования это будет выглядеть примерно так:
let main_document =
db.findOne({
_id: ObjectId(first)
})
let subdocument =
db.findOne({
_id: ObjectId(second)
})
main_document.subdocument = subdocument
return main_document
Вы можете использовать ниже агрегации
Вам не нужно указывать localField
в новом синтаксисе $lookup
. Просто используйте $match
внутри подчиненного конвейера агрегации $lookup
db.main_document.aggregate([
{ "$match": { "_id": ObjectId(first) }},
{ "$lookup": {
"from": "subdocument",
"pipeline": [
{ "$match": { "_id": ObjectId(second) }},
],
"as": "subdocument"
}},
{ "$unwind": "$subdocument" }
])