#mongodb #aggregation-framework
#mongodb #агрегация-фреймворк
Вопрос:
Я пытаюсь настроить запрос в mongo, который выполняет поиск в 3 разных коллекциях.
Документ клиента:
{
"_id": ObjectId("1a")
"razaosocial:"32423424",
"prepository": [
{
"$ref": "prepository",
"$id": ObjectId("2a")
}
]
}
Предварительный документ:
{
"_id": ObjectId("2a")
"name:"Jonh",
"prepository": {
"$ref": "representative",
"$id": ObjectId("3a")
}
}
Документ представителя:
{
"_id": ObjectId("3a")
"name:"Josh"
}
Я делаю это таким образом, но это ничего не возвращает:
db.clients.aggregate(
[
{
$lookup: {
from: 'prepository',
localField: 'prepository',
foreignField: 'id',
as: 'prepository'
}
},
{ $unwind: "$prepository" },
{ $lookup: {
from: 'representative',
localField: 'id',
foreignField: 'prepository._id',
as: 'prepository.repre'
}
},
{ $group: {
_id: "$_id",
client: { $first: "$razaosocial" },
users: {
$push: "$prepository"
}
} }
])
Я пытаюсь вернуть
{
"_id": "1a"
"razaosocial:"32423424",
"prepository": [
{
"_id": "2a"
"name:"Jonh",
"representative": {
"_id": "3a"
"name:"Josh"
}
}
]
}
Я благодарен за любую помощь
Комментарии:
1. Да, я исправлю
Ответ №1:
Вы можете использовать вложенный поиск,
$lookup
сprepository
коллекцией$match
сprepository
идентификатором$lookup
сrepresentative
коллекцией$unwind
деконструироватьrepresentative
массив
db.client.aggregate([
{
$lookup: {
from: "prepository",
as: "prepository",
let: { prepository: "$prepository" },
pipeline: [
{ $match: { $expr: { $in: ["$_id", "$$prepository"] } } },
{
$lookup: {
from: "representative",
localField: "representative",
foreignField: "_id",
as: "representative"
}
},
{ $unwind: "$representative" }
]
}
}
])