Quindi fondamentalmente usando .aggregate()
invece di .find()
:
db.tweets.aggregate([
{ "$project": {
"_id": 0,
"coords": "$level1.level2.coordinates"
}}
])
E questo ti dà il risultato che desideri.
MongoDB 2.6 e versioni successive restituiscono un "cursore" proprio come fa find.
Vedi $project
e altri operatori del framework di aggregazione per maggiori dettagli.
Nella maggior parte dei casi dovresti semplicemente rinominare i campi come restituito da .find()
durante l'elaborazione del cursore. Per JavaScript come esempio, puoi usare .map()
per farlo.
Dalla shell:
db.tweets.find({},{'level1.level2.coordinates': 1, _id:0}).map( doc => {
doc.coords = doc['level1']['level2'].coordinates;
delete doc['level1'];
return doc;
})
O più in linea:
db.tweets.find({},{'level1.level2.coordinates': 1, _id:0}).map( doc =>
({ coords: doc['level1']['level2'].coordinates })
)
Ciò evita qualsiasi sovraccarico aggiuntivo sul server e dovrebbe essere utilizzato nei casi in cui il sovraccarico di elaborazione aggiuntivo supererebbe il guadagno dell'effettiva riduzione delle dimensioni dei dati recuperati. In questo caso ( e nella maggior parte dei casi ) sarebbe minimo e quindi meglio rielaborare il risultato del cursore per ristrutturarlo.