Как найти отдельное значение с количеством других массивов внутри документа dhe в MongoDB

#java #mongodb

Вопрос:

Я хочу получить отдельный код категории и имя категории, в то время как этот документ также содержит список аксессуаров, которые я хочу учесть в ответе.

Примеры данных:

 [
   {
      "categoryCode":"categoryCode1",
      "categoryName":"categoryName1",
      "accessories":[{"a_id":1},{"a_id":2}]
   },
   {
      "categoryCode":"categoryCod2",
      "categoryName":"categoryName2",
      "accessories":[{"a_id":1},{"a_id":2},{"a_id":3}]
   },
   {
      "categoryCode":"categoryCode1",
      "categoryName":"categoryNam1",
      "accessories":[{"a_id":1},{"a_id":2}]
   }
]
 

Ожидаемый результат:

 [
   {
      "categoryCode":"categoryCode1",
      "categoryName":"categoryName1",
      "accessoriesCount":2
   },
   {
      "categoryCode":"categoryCod2",
      "categoryName":"categoryName2",
      "accessoriesCount":3
   }
]
 

Ответ №1:

https://mongoplayground.net/p/q6AZOaTwo5a

 db.collection.aggregate([
  {
    "$group": {
      "_id": {
        categoryCode: "$categoryCode",
        "categoryName": "$categoryName"
      },
      "accessories": {
        "$addToSet": "$accessories"
      }
    }
  },
  {
    "$project": {
      categoryCode: "$_id.categoryCode",
      categoryName: "$_id.categoryName",
      accessoriesCount: {
        $size: "$accessories"
      },
      _id: 0
    }
  }
])
 

Ответ №2:

Запрос

  • группа, имеющая различные значения
  • $push массивы аксессуаров (у нас нет $concat аккумулятора)
  • сократите эти массивы, чтобы объединить их, оставьте только отдельные элементы и подсчитайте количество.

Тестовый код здесь

 db.collection.aggregate([
  {
    "$group": {
      "_id": {
        "categoryCode": "$categoryCode",
        "categoryName": "$categoryName"
      },
      "accessories": {
        "$push": "$accessories"
      }
    }
  },
  {
    "$set": {
      "accessoriesCount": {
        "$size": {
          "$reduce": {
            "input": "$accessories",
            "initialValue": [],
            "in": {
              "$setUnion": [
                "$value",
                "$this"
              ]
            }
          }
        }
      }
    }
  },
  {
    "$project": {
      "_id": 0,
      "categoryCode": "$_id.categoryCode",
      "categoryName": "$_id.categoryName",
      "accessoriesCount": "$accessoriesCount"
    }
  }
])