#javascript #node.js #mongodb #aggregation-framework
#javascript #node.js #mongodb #агрегация-фреймворк
Вопрос:
Ниже приведен пример документа
[
{
"name": "john"
"attribute":[
{
nameAttr: "abc"
tagAttr: "zxs"
},
{
nameAttr: "asd"
tagAttr: "zxs"
},
{
nameAttr: "lll"
tagAttr: "zxs"
},
]
},
{
"name": "john"
"attribute":[
{
nameAttr: "abc"
tagAttr: "zxs"
},
{
nameAttr: "sss"
tagAttr: "zxs"
},
{
nameAttr: "asd"
tagAttr: "zxs"
},
]
},
]
Я хочу получить все общие выходные данные nameAttr как [«abc», «asd»], поскольку они являются общими в обоих документах
Я могу проецировать только nameAttr с помощью project, но не знаю, как действовать дальше
db.collection.aggregate ([
{
$project: {
"attribute.nameAttr": 1,
}
}
])
Ответ №1:
Вы можете использовать $group для сбора всех имен атрибутов в массив массивов, а затем использовать $reduce с $setIntersection для получения общих:
db.collection.aggregate([
{
$group: {
_id: null,
attributes: { $push: "$attribute.nameAttr" }
}
},
{
$project: {
commonAttributes: {
$reduce: {
input: "$attributes",
initialValue: { $arrayElemAt: [ "$attributes", 0 ] },
in: { $setIntersection: [ "$$value", "$$this" ] }
}
}
}
}
])