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