Как получить общие атрибуты из массива объектов в mongodb

#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" ] }
                }
            }
        }
    }
])
  

Игровая площадка Mongo