Извлечение уникальных объектов с помощью mongoldb

#mongodb #mongodb-query

#mongodb #mongodb-запрос

Вопрос:

Я пытаюсь создать запрос для MongoDB, который возвращает все уникальные значения из массива в документе по значению ключа ( batch_id ). Мне удалось сделать это, сгруппировав уникальные batch_ids , однако я не могу извлечь соответствующее значение ключа ( batchName ) и подсчитать количество объектов, которые имели уникальные значения для каждого массива.

Как мне извлечь batchName и подсчитать количество объектов? Я попробовал несколько вещей, однако, думаю, у меня возникли проблемы $addToSet .

MongoPlayground: https://mongoplayground.net/p/j6Jkeh79Zqq

Мой текущий результат:

 [
  {
    "_id": "6032a5ad80443334a35f2232",
    "batchData": [
      {
        "batch_id": "6032a5af80443334a35f2267TB"
      },
      {
        "batch_id": "6032a5af80443334a35f26467JC"
      },
      {
        "batch_id": "6032a5af80443334a5f74367UI"
      }
    ]
  }
]
 

Мой ожидаемый результат

     [
      {
        "_id": "6032a5ad80443334a35f2232",
        "batchData": [
          {
            "batch_id": "6032a5af80443334a35f2267TB",
            "batchName": "Test 2",
            "count": 2
          },
          {
            "batch_id": "6032a5af80443334a35f26467JC",
            "batchName": "Test 3",
            "count": 1
          },
          {
            "batch_id": "6032a5af80443334a5f74367UI",
            "batchName": "Test 1",
            "count": 2
          }
        ]
      }
    ]
 

Пример документа:

 [
  {
    "_id": "6032a5ad80443334a35f2232",
    "List": [
      {
        "_id": "6032a5af80443334a35f2234",
        "batch_id": "6032a5af80443334a5f74367UI",
        "batchName": "Test 1",
        
      },
      {
        "_id": "6032a5b080443334a35f2236",
        "batch_id": "6032a5af80443334a5f74367UI",
        "batchName": "Test 1",
        
      },
      {
        "_id": "6032a5b080443334a35f2238",
        "batch_id": "6032a5af80443334a35f2267TB",
        "batchName": "Test 2",
        
      },
      {
        "_id": "6032a5b080443334a35f2239",
        "batch_id": "6032a5af80443334a35f2267TB",
        "batchName": "Test 2",
        
      },
      {
        "_id": "6032a5b080443334a35f2234",
        "batch_id": "6032a5af80443334a35f26467JC",
        "batchName": "Test 3",
        
      }
    ]
  }
]
 

Запрос Mongo:

 db.collection.aggregate([
  {
    $project: {
      batchData: {
        batch_id: "$List.batch_id",
        
      },
      
    },
    
  },
  {
    $unwind: "$batchData.batch_id"
  },
  {
    $group: {
      _id: "$_id",
      batchData: {
        $addToSet: "$batchData"
      },
      
    },
    
  },
  
])
 

Ответ №1:

Вы можете сначала $unwind сгладить массив для облегчения обработки. После этого вы можете $group снова использовать данные и использовать $first для получения имени пакета. Наконец, вы можете сделать еще $group один шаг для форматирования в ожидаемый формат.

Вот игровая площадка Монго для вашей справки.