Така че основно се използва .aggregate()
вместо .find()
:
db.tweets.aggregate([
{ "$project": {
"_id": 0,
"coords": "$level1.level2.coordinates"
}}
])
И това ви дава желания резултат.
Версиите на MongoDB 2.6 и по-нови връщат "курсор", точно както го прави find.
Вижте $project
и други оператори на рамката за агрегиране за повече подробности.
В повечето случаи трябва просто да преименувате полетата, както са върнати от .find()
при обработка на курсора. За JavaScript като пример можете да използвате .map()
за да направите това.
От черупката:
db.tweets.find({},{'level1.level2.coordinates': 1, _id:0}).map( doc => {
doc.coords = doc['level1']['level2'].coordinates;
delete doc['level1'];
return doc;
})
Или повече вградени:
db.tweets.find({},{'level1.level2.coordinates': 1, _id:0}).map( doc =>
({ coords: doc['level1']['level2'].coordinates })
)
Това избягва всякакви допълнителни разходи за сървъра и трябва да се използва в такива случаи, когато допълнителните разходи за обработка биха надхвърлили печалбата от действителното намаляване на размера на извлечените данни. В този случай (и повечето) би било минимално и следователно по-добре да се обработи отново резултатът от курсора за преструктуриране.