«Можно ли достичь без операции раскрутки $?»
Хорошо ДА.Пока ваша структура массивов массивов последовательно отображается таким образом, вам действительно нужна только одна стадия в конвейере:
db.collection.aggregate([
{ "$addFields": {
"combs": {
"$map": {
"input": "$combs",
"in": { "$mergeObjects": "$$this" }
}
}
}}
])
Так что на самом деле $map
Оператор используется здесь как гораздо более эффективный метод, чем $unwind
для обработки каждого элемента массива.Кроме того, поскольку $mergeObjects
ожидает «массив объектов» , это то, чем фактически является каждый элемент вашего массива массивов .Так просто { "$mergeObjects": "$$this" }
на каждом внешнем элементе массива.
Производит вывод из ваших предоставленных данных:
{
"_id" : ObjectId("5d8865c273375a6a4cc9e76a"),
"combs" : [
{
"name" : "A",
"c_type" : "A",
"type" : "visual",
"severity" : "Normal"
},
{
"name" : "B",
"c_type" : "B",
"type" : "visual",
"severity" : "Normal"
}
]
}
Как правило, вы всегда должны предпочитать встроенный процессорнапример, $map
или другие операторы массива вместо $unwind
, где это применимо.