Existem algumas abordagens para isso, mas depende muito da sua versão do MongoDB. Versões mais recentes de 2.6 e superiores suportam o
$ mapa
operador que você pode usar em $project
para fazer o que você quer:db.friend.aggregate([
{ "$project": {
"name": 1,
"buddies": {
"$map": {
"input": "$friends",
"as": "el",
"in": {
"nickName": "$$el.name",
"age": "$$el.age"
}
}
}
}}
])
Nas versões anteriores, você usaria
$unwind
para trabalhar com os elementos do array e reconstruí-los via $grupo
:db.collection.aggregate([
{ "$unwind": "$friends" },
{ "$group": {
"_id": "$_id",
"name": { "$first": "$name" },
"buddies": {
"$push": {
"nickName": "$friends.name",
"age": "$friends.age"
}
}
}}
])
Com o primeiro formulário sendo um pouco mais eficiente, pois você não está desnormalizando o conteúdo da matriz e produzindo mais documentos no pipeline para processar.