Я пробовал много ответов на похожие проблемы, используя $ lookup, $ unwind и $ match, но я не могу заставить это работать для моей ситуации с суб-суб-субдокументами.
У меня есть это коллекция, Вещи:
{
"_id" : ObjectId("5a7241f7912cfc256468cb27"),
"name" : "Fortress of Solitude",
"alias" : "fortress_of_solitude",
},
{
"_id" : ObjectId("5a7247ec548c9ad042f579e2"),
"name" : "Batcave",
"alias" : "batcave",
},
{
"_id" : ObjectId("6a7247bc548c9ad042f579e8"),
"name" : "Oz",
"alias" : "oz",
},
и эта коллекция из одного документа, Место проведения:
{
"_id" : ObjectId("5b9acabbbf71f39223f8de6e"),
"name" : "The Office",
"floors" : [
{
"name" : "1st Floor",
"places" : [
{
"name" : "Front Entrance",
"alias" : "front_entrance"
}
]
},
{
"name" : "2nd Floor",
"places" : [
{
"name" : "Batcave",
"alias" : "batcave"
},
{
"name" : "Oz",
"alias" : "oz"
}
]
}
]
}
Я хочу вернуть все Вещи, но с floors.places.name
Места проведения, агрегированным с каждой Вещью если он существует, если псевдонимы совпадают между вещами и местами. Итак, я хочу вернуть:
{
"_id" : ObjectId("5a7241f7912cfc256468cb27"),
"name" : "Fortress of Solitude",
"alias" : "fortress_of_solitude",
<-- nothing added here because
<-- it's not found in Venues
},
{
"_id" : ObjectId("5a7247ec548c9ad042f579e2"),
"name" : "Batcave",
"alias" : "batcave",
"floors" : [ <-- this should be
{ <-- returned
"places" : [ <-- because
{ <-- the alias
name" : "Batcave" <-- matches
} <-- in Venues
] <--
} <--
] <--
},
{
"_id" : ObjectId("6a7247bc548c9ad042f579e8"),
"name" : "Oz",
"alias" : "oz",
"floors" : [ <-- this should be
{ <-- returned
"places" : [ <-- because
{ <-- the alias
name" : "Oz" <-- matches
} <-- in Venues
] <--
} <--
] <--
}
Я дошел до следующего запроса, но он возвращает только весь массив Venues.floors в виде агрегата для каждой вещи, что слишком много постороннего данные агрегированы. Я просто хочу объединить каждый соответствующий субподдокумент floor.place из Venues с соответствующим Thing, если он существует в Venues.
db.getCollection('things').aggregate([
{$lookup: {from: "venues",localField: "alias",foreignField: "floors.places.alias",as: "matches"}},
{
$replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: [ "$matches", 0 ] }, "$$ROOT" ] } }
},
{ $project: { matches: 0 } }
])
Я борюсь с существующими ответами, которые, похоже, меняются в MongoDB версии 3.2. , 3.4, 3.6 или 4.2 включать или не включать $ unwind, $ pipe и другие термины. Может кто-нибудь объяснить, как получить подобласть подобного рода? Спасибо!