У меня есть запрос Mongo DB
, который возвращается в ожидаемом формате:
db.getCollection("myCollection").aggregate([
{
$lookup: {
from: "myCollection",
localField: "parent_id",
foreignField: "parent_id",
as: "children"
}
},
{ $unwind: "$children" },
{ $replaceWith: "$children" }
])
Однако я также хочу, чтобы поле parent_desc
, которое присутствует только в родительских документах, возвращалось в дочерних документах в моем ответе.
пример дочернего документа:
{
id: doc_123_2
parent_id: 123
active: true
}
пример родительского документа:
{
_id: doc_123
parent_id: 123
active: true
parent_desc: sample parent desc
}
Как я могу изменить свой запрос для этого?
Я не думаю, что это обязательно будет чище, чем ответ @cmgchess ниже, но вот альтернатива, в которой слияние происходит в финальном преобразовании $replaceWith
, а не внутри $lookup
: mongoplayground.net/p/TnTA41zx6A3
MongoDB: возвращаемое поле в дочерних документах, которое присутствует только в родительском?
Чтобы вернуть поле, присутствующее в родительском дочернем документе, вы можете использовать приведенный ниже код. Он использует addFields
для добавления обязательного поля parent_desc
в дочерний документ, как показано в выводе ниже:
db.getCollection("newcoll").aggregate([
{
$lookup: {
from: "newcoll",
localField: "parent_id",
foreignField: "parent_id",
as: "children"
}
},
{ $unwind: "$children" },
{ $replaceWith: "$children" },
{
$lookup: {
from: "newcoll",
localField: "parent_id",
foreignField: "parent_id",
as: "parent"
}
},
{ $unwind: "$parent" },
{
$addFields: {
parent_desc: "$parent.parent_desc"
}
},
{
$group: {
_id: "$_id",
id: { $first: "$id" },
parent_id: { $first: "$parent_id" },
active: { $first: "$active" },
parent_desc: { $first: "$parent_desc" }
}
},
{
$project: {
_id: 1,
id: 1,
parent_id: 1,
active: 1,
parent_desc: 1
}
}
]).pretty()
Выход:
{
"_id" : ObjectId("662616f0af88e119ac2f49c3"),
"id" : "doc_123_2",
"parent_id" : "123",
"active" : true,
"parent_desc" : "sample parent desc"
}
{
"_id" : ObjectId("66261744af88e119ac2f49c4"),
"id" : "doc_123",
"parent_id" : "123",
"active" : true,
"parent_desc" : "sample parent desc"
}