Jadi pada dasarnya menggunakan .aggregate()
bukannya .find()
:
db.tweets.aggregate([
{ "$project": {
"_id": 0,
"coords": "$level1.level2.coordinates"
}}
])
Dan itu memberi Anda hasil yang Anda inginkan.
MongoDB 2.6 dan versi di atasnya menampilkan "kursor" seperti yang dilakukan find.
Lihat $project
dan operator kerangka kerja agregasi lainnya untuk detail selengkapnya.
Untuk sebagian besar kasus, Anda cukup mengganti nama bidang seperti yang dikembalikan dari .find()
saat memproses kursor. Untuk JavaScript sebagai contoh, Anda dapat menggunakan .map()
untuk melakukan ini.
Dari cangkang:
db.tweets.find({},{'level1.level2.coordinates': 1, _id:0}).map( doc => {
doc.coords = doc['level1']['level2'].coordinates;
delete doc['level1'];
return doc;
})
Atau lebih sebaris:
db.tweets.find({},{'level1.level2.coordinates': 1, _id:0}).map( doc =>
({ coords: doc['level1']['level2'].coordinates })
)
Ini menghindari overhead tambahan di server dan harus digunakan dalam kasus seperti di mana overhead pemrosesan tambahan akan lebih besar daripada keuntungan pengurangan aktual dalam ukuran data yang diambil. Dalam hal ini ( dan sebagian besar ) akan menjadi minimal dan oleh karena itu lebih baik untuk memproses ulang hasil kursor untuk merestrukturisasi.