2012-09-14 15 views
12

オブジェクトのネストされた配列をソートする方法を探しています。ここでは例です:MongoDB:オブジェクトのネストされた配列をソート

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

は、どのように私はそれを達成することができ、今私はすべてのnameを見つけたいとしanswersアレイではなく、優勢ためにそれをソートしますか?

答えて

23

ご希望の順序で保存します。または、クライアント側で取り出した後にソートします。

> 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"}}} 
]); 

生成します:それらのどちらも可能性がある場合は

、あなたはaggregation frameworkを使用することができます

{ 
    "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

を検索を実行した後()あなたは戻り値に並べ替え()を使用することができます。

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

findは、コレクション内のすべてのドキュメントの名前フィールドを抽出します。ソートすると、名前で昇順にソートされます。

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

+1

あなたの '' answers.name ''キーの周りに引用符が必要です。しかし、私はあなたのコードが彼が探しているものをやっているとは思わない... –

+4

あなたの例では、 '_id'フィールドと' name'配列を持つすべてのドキュメントを、各配列の最初の名前でソートしてリストします。 'sort()'はドキュメントレベルで動作し、ドキュメント内の配列を並べ替えません。 – Stennie

4

これは、このコンテキストでは有用ではないかもしれませんが、私はこれを追加しようと思いました。また、複数の方法でソートする必要がない非正規化コレクションの方が良い傾向にある書き込みでソートすることもできます。

ユーザーにフィードを作成するときに、この状況がアプリで発生しました。

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 } 
     } 
     } 
    }); 
    } 
}); 

私はあなたがしてfind()を使用することができ、それは、デフォルトでは、あなたの仕様でソートされますので、それはかなり便利であることが判明。

+0

私は$という名前のフィールドを設定できないということについて、ミニゴンのエラーが発生しています...私はこれが本当に私が望むものに近いと思う – lol

関連する問題