Поле сложения Mongodb, содержащее текущую позицию объекта в запросе массива

#mongodb #aggregate

Вопрос:

После последнего агрегированного конвейера я получаю текущий массив:

 [{
    "cdrId": "61574b3e58fb1cae1494df2c",
    "date": "2021-10-01T17:54:06.057Z",
    "intentType": "FALLBACK"
},
{
    "cdrId": "61574b3e58fb1cae1494df2c",
    "date": "2021-10-01T17:54:06.057Z",
    "intentType": "FAQ"
},
{
    "cdrId": "61570b37522aba5e2f205356",
    "date": "2021-10-01T13:20:55.601Z",
    "intentType": "TRANS/DISAM"
},
{
    "cdrId": "61570b37522aba5e2f205356",
    "date": "2021-10-01T13:20:55.601Z",
    "intentType": "FAQ"
}]
 

Я хочу добавить поле индекса, показывающее текущее положение объекта в массиве. Результат будет примерно таким:

 [{
    "index": 0,
    "cdrId": "61574b3e58fb1cae1494df2c",
    "date": "2021-10-01T17:54:06.057Z",
    "intentType": "FALLBACK"
},
{
    "index": 1,
    "cdrId": "61574b3e58fb1cae1494df2c",
    "date": "2021-10-01T17:54:06.057Z",
    "intentType": "FAQ"
},
{
    "index": 2,
    "cdrId": "61570b37522aba5e2f205356",
    "date": "2021-10-01T13:20:55.601Z",
    "intentType": "TRANS/DISAM"
},
{
    "index": 3,
    "cdrId": "61570b37522aba5e2f205356",
    "date": "2021-10-01T13:20:55.601Z",
    "intentType": "FAQ"
}]
 

Я буду использовать это значение, если следующий канал отсортирует этот массив. Так что у меня есть исходное положение до этой сортировки.

Есть ли способ, которым я могу сделать это с помощью aggregate? Я использую MongoDB 4.2.

Ответ №1:

Попробуй вот это:

 db.collection.aggregate([
  // {$sort: {...} },
  {
    $group: {
      _id: null,
      data: { $push: "$ROOT" }
    }
  },
  {
    $unwind: {
      path: "$data",
      includeArrayIndex: "index"
    }
  },
  {
    $replaceRoot: {
      newRoot: { $mergeObjects: [ "$data", {index: "$index"} ] }
    }
  }
])
 

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