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à đó cung cấp cho bạn kết quả mà bạn muốn.
MongoDB phiên bản 2.6 trở lên trả lại một "con trỏ" giống như tìm kiếm.
Xem $project
và aggregation framework operators 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 trường khi đượ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()
để thực hiện việc 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 inline hơn:
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 trên máy chủ và sẽ được sử dụng trong những trường hợp như vậy mà chi phí xử lý bổ sung sẽ lớn hơn những lợi ích 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) nó sẽ là tối thiểu và do đó tốt hơn để tái xử lý kết quả con trỏ để cơ cấu lại.
Nguồn
2014-05-21 13:39:22