Vì vậy, về cơ bản sử dụng .aggregate()
thay vì .find()
:
db.tweets.aggregate([
{ "$project": {
"_id": 0,
"coords": "$level1.level2.coordinates"
}}
])
Và điều đó mang lại cho bạn kết quả như mong muốn.
MongoDB phiên bản 2.6 trở lên trả về một "con trỏ" giống như find.
Xem $project
và các toán tử khung tổng hợp khác để biết thêm chi tiết.
Đối với hầu hết các trường hợp, bạn chỉ cần đổi tên các trường như được trả về từ .find()
khi xử lý con trỏ. Đối với JavaScript làm ví dụ, bạn có thể sử dụng .map()
để làm điều này.
Từ vỏ:
db.tweets.find({},{'level1.level2.coordinates': 1, _id:0}).map( doc => {
doc.coords = doc['level1']['level2'].coordinates;
delete doc['level1'];
return doc;
})
Hoặc nội tuyến khác:
db.tweets.find({},{'level1.level2.coordinates': 1, _id:0}).map( doc =>
({ coords: doc['level1']['level2'].coordinates })
)
Điều này tránh bất kỳ chi phí bổ sung nào trên máy chủ và nên được sử dụng trong những trường hợp khi chi phí xử lý bổ sung sẽ lớn hơn lợi ích của việc giảm kích thước thực tế của dữ liệu được truy xuất. Trong trường hợp này (và hầu hết), sẽ là tối thiểu và do đó tốt hơn nên xử lý lại kết quả con trỏ để cơ cấu lại.