Мне нужна ваша помощь. Учитывая приведенную ниже структуру, мне нужно запросить документ таким образом, чтобы получить все «продукты» для данного поставщика.
{
"supplier" : [
{"name" : "supplier 1",
"products" : [
{ "name" : "product 1" }
{ "name" : "product 2" }
]
},
{
"name" : "supplier 1",
"products" : [
{ "name" : "product 3" }
]
},
{
"name" : "supplier 2",
"products" : [
{ "name" : "product 3" }
]
},
]
}
Результирующий документ для «поставщика 1» должен быть следующим (или подобным).
{
"products" : [
{ "name" : "product 1" },
{ "name" : "product 2" },
{ "name" : "product 3" }
]
}
Результат должен содержать только уникальные значения для products
.
Какое хорошее серверное решение для этого? Заранее спасибо.
$unwind
деконструировать supplier
массив$group
на supplier.name
и сделать массив из products
$project
для отображения обязательных полей, $reduce
для повторения цикла products
и объединения массивов или продуктов с использованием $concatArrays
db.collection.aggregate([
{ $unwind: "$supplier" },
{
$group: {
_id: "$supplier.name",
products: { $push: "$supplier.products" }
}
},
{
$project: {
_id: 0,
name: "$_id",
products: {
$reduce: {
input: "$products",
initialValue: [],
in: { $concatArrays: ["$$this", "$$value"] }
}
}
}
}
])
Большое спасибо! Это работает отлично. Я не знал о функции $reduce/$concathArrays. Это было действительно полезно! счастливого рождества