В современных выпусках MongoDB наиболее эффективным способом является простое обозначение нового поля как массива. Это позволило с MongoDB 3,2:
db.collection.aggregate([
{ "$project": {
"names": [ "$senderName", "$receiverName" ]
}}
])
Вероятно, самый простой способ сделать это с нами, используя $map
оператор, введенный в MongoDB 2.6. Он преобразует массивы так это то, что вы в принципе сделать:
db.collection.aggregate([
{ "$project": {
"names": { "$map": {
"input": { "$literal": ["first","last"] },
"as": "el",
"in": { "$cond": [
{ "$eq": [ "$$el", "first" ] },
"$senderName",
"$receiverName"
]}
}}
}}
])
В качестве альтернативы вы можете сделать подобный процесс с более ранними версиями, которые не поддерживают оператора, но не очень эффективно:
db.collection.aggregate([
{ "$project": {
"senderName": 1,
"receiverName": 1,
"type": { "$const": [ "first", "last" ] }
}},
{ "$unwind": "$type" },
{ "$group": {
"_id": "$_id",
"names": { "$push": { "$cond": [
{ "$eq": [ "$type", "first" ] },
"$senderName",
"$receiverName"
]}}
}}
])
Но так в любом случае вы на самом деле не агрегируете что-либо, это справедливый аргумент для использования аналогичного подхода map
в клиентском коде с помощью вашей собственной поддержки для этого языка. Но если вам нужно использовать его на каком-то этапе вашей агрегации, тогда вам нужно это сделать.
Вы все еще можете это сделать, и это так.