Donc, en gros, en utilisant .aggregate()
au lieu de .find()
:
db.tweets.aggregate([
{ "$project": {
"_id": 0,
"coords": "$level1.level2.coordinates"
}}
])
Et cela vous donne le résultat que vous voulez.
MongoDB 2.6 et les versions supérieures renvoient un "curseur", tout comme find.
Voir $project
et d'autres opérateurs de framework d'agrégation pour plus de détails.
Dans la plupart des cas, vous devez simplement renommer les champs tels qu'ils sont renvoyés par .find()
lors du traitement du curseur. Pour JavaScript par exemple, vous pouvez utiliser .map()
pour ce faire.
Depuis le shell :
db.tweets.find({},{'level1.level2.coordinates': 1, _id:0}).map( doc => {
doc.coords = doc['level1']['level2'].coordinates;
delete doc['level1'];
return doc;
})
Ou plus en ligne :
db.tweets.find({},{'level1.level2.coordinates': 1, _id:0}).map( doc =>
({ coords: doc['level1']['level2'].coordinates })
)
Cela évite toute surcharge supplémentaire sur le serveur et doit être utilisé dans les cas où la surcharge de traitement supplémentaire l'emporterait sur le gain de la réduction réelle de la taille des données récupérées. Dans ce cas (et dans la plupart des cas), il serait minime et donc préférable de retraiter le résultat du curseur pour le restructurer.