2014-05-21 16 views
23

Có thể đổi tên tên của các trường được trả lại trong truy vấn tìm không? Tôi muốn sử dụng một cái gì đó như $rename, tuy nhiên tôi không muốn thay đổi các tài liệu tôi đang truy cập. Tôi muốn chỉ để lấy chúng một cách khác nhau, một cái gì đó hoạt động như SELECT COORINATES AS COORDS trong SQL.Làm cách nào để đổi tên các trường khi thực hiện tìm kiếm/chiếu trong MongoDB?

Những gì tôi làm bây giờ:

db.tweets.findOne({}, {'level1.level2.coordinates': 1, _id:0}) 
{'level1': {'level2': {'coordinates': [10, 20]}}} 

Những gì tôi muốn được trả lại là: {'coords': [10, 20]}

Trả lời

23

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 $projectaggregation 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.

Các vấn đề liên quan