2012-09-14 48 views
12

Tôi đang tìm cách sắp xếp một mảng lồng nhau của các đối tượng. Dưới đây là một ví dụ:MongoDB: sắp xếp mảng lồng nhau của các đối tượng

answers: [ 
      {name: 'paul', state: 'RU'}, 
      {name: 'steve', state: 'US'}, 
      {name: 'mike', state: 'DE'}, 
      ... 
     ] 

Giả sử bây giờ tôi muốn tìm tất cả các name, của mảng answers, nhưng sắp xếp nó theo thứ tự lên cao, làm thế nào tôi có thể thực hiện điều đó?

Trả lời

23

Tôi sẽ lưu trữ theo thứ tự bạn muốn trả lại. Hoặc sắp xếp nó sau khi bạn kéo nó ra, ở phía khách hàng.

Nếu không những có thể xảy ra, bạn có thể sử dụng aggregation framework:

> db.test.insert({answers: [ 
...     {name: 'paul', state: 'RU'}, 
...     {name: 'steve', state: 'US'}, 
...     {name: 'mike', state: 'DE'}]}); 
> db.test.insert({answers: [ 
...     {name: 'paul', state: 'RU'}, 
...     {name: 'steve', state: 'US'}, 
...     {name: 'xavier', state: 'TX'}]}); 

db.test.aggregate([ 
    {$unwind: "$answers"}, 
    {$sort: {"answers.name":1}}, 
    {$group: {_id:"$_id", answers: {$push:"$answers"}}} 
]); 

sản xuất:

{ 
    "result" : [ 
    { 
    "_id" : ObjectId("5053b2477d820880c3469364"), 
    "answers" : [ 
     { 
     "name" : "paul", 
     "state" : "RU" 
     }, 
     { 
     "name" : "steve", 
     "state" : "US" 
     }, 
     { 
     "name" : "xavier", 
     "state" : "TX" 
     } 
    ] 
    }, 
    { 
    "_id" : ObjectId("5053af9f7d820880c3469363"), 
    "answers" : [ 
     { 
     "name" : "mike", 
     "state" : "DE" 
     }, 
     { 
     "name" : "paul", 
     "state" : "RU" 
     }, 
     { 
     "name" : "steve", 
     "state" : "US" 
     } 
    ] 
    } 
], 
    "ok" : 1 
} 
-2

Sau khi thực hiện một find(), bạn có thể sử dụng loại() trên giá trị trả về.

db.collection.find({},{"answers.name":1}).sort({"answers.name":1}) 

Tìm sẽ trích xuất các trường tên của tất cả tài liệu trong bộ sưu tập. Sắp xếp sau đó sẽ sắp xếp chúng theo tên, tăng dần.

http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order

+1

Bạn cần dấu ngoặc kép quanh các phím '" answers.name "'. Nhưng tôi không nghĩ rằng mã của bạn làm những gì anh ta đang tìm kiếm ... –

+4

Ví dụ của bạn sẽ liệt kê tất cả các tài liệu với trường '_id' và' name', được sắp xếp theo tên đầu tiên trong mỗi mảng. 'Sort()' hoạt động ở cấp tài liệu và không sắp xếp lại các mảng trong các tài liệu. – Stennie

4

này có thể không thể hữu ích trong bối cảnh này, nhưng tôi nghĩ rằng tôi muốn thêm này. Bạn cũng có tùy chọn để sắp xếp nó trên ghi mà có xu hướng tốt hơn cho các bộ sưu tập không chuẩn hóa, nơi bạn không phải sắp xếp theo nhiều cách.

Tôi đã tìm thấy tình huống này trong ứng dụng của mình khi tạo nguồn cấp dữ liệu trên người dùng.

Meteor.users.helpers({ 
    'addToFeed': function (gameId, pushData) { 
    check(pushData, FeedSchema); 
    Meteor.users.update({ 
     _id: this._id, 
     "games.gameId": gameId 
    }, { 
     $push: { 
     "games.$.feed": { 
      $each: [pushData], 
      $sort: { timestamp: -1 } 
     } 
     } 
    }); 
    } 
}); 

Tôi thấy nó khá tiện dụng vì bạn có thể sử dụng find() và nó sẽ được sắp xếp theo thông số kỹ thuật của bạn theo mặc định.

+0

Tôi gặp lỗi minimongo về việc không thể đặt trường có tên $ ... Bất kỳ ý tưởng nào? Tôi nghĩ điều này thực sự gần với những gì tôi muốn – lol

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