2016-04-30 10 views
0

私はこのフィールド内のオブジェクトをMongoDBの値でソートするには?

{ 
    "_id" : "word", 
    "nextWords" : { 
     "x" : 3, 
     "y" : 2, 
     "z" : 1, 
     "h" : 1, 
     "n" : 10 
    } 
} 

のような文書を持っていると私は降順にソート「nextWords」内のオブジェクトを返すようにしたい場合。

MongoDBシェルまたはJavaのどちらでも実行できますか?

編集:

{ 
    "n" : 10 
    "x" : 3, 
    "y" : 2, 
    "z" : 1, 
    "h" : 1, 
} 
+0

{ $プッシュ:{ :{ $それぞれ:[、...]、 ソート$:<ソート指定> }} } – Robus

+0

あなたはもっと手の込んだことができますか?どこにこれを渡すべきですか?更新操作の場合はドキュメント全体に適用したいと思って書き込みが難しいと思います –

+0

要するに、このデータモデルではできません。フィールドが返される順序は、単純に任意です。コード内でソートをプログラムで実行する必要があります。 –

答えて

-1

{「_id」を次のようにあなたの代わりにそれを行うことができます:私は期待が出力されるので、「nextWords」は、その値に応じて降順にソートします: "単語"、 "nextWords":[{ "単語": "X"、 "カウント":3}、...]}

使用マップは低減:

String map = "function() { for(i in this.nextWords)emit(i.word,i.count) } 

String reduce = "function(key,value){return (value);}"; 
Javaで

実行し、それを:

MapReduceCommand cmd = new MapReduceCommand(collection, map, reduce, null, MapReduceCommand.OutputType.INLINE, null); 

MapReduceOutput out = collection.mapReduce(cmd); 

for (DBObject o : out.results()) { 
     // here put them in an array 
    } 

//は

+0

放出された値の順序は、順序通りであってもなくてもよい。あなたのマップを減らしても、この事実は変わりません。さらに、その構造では、 'db.words.aggregate({$ unwind:" $ nextWords "}、{$ sort:{" $ nextWord.count ":-1}}と同じようにmap/reduceはまったく不要です。 $ group:{_ id: "$ word"、ソート済み:{$ push: "$ nextWord"}}}) 'はコードに入れた繰り返しと同じことを行います。 –

+0

Javaでmongodbのapiを使用すると、ネストされたサブドキュメントにアクセスすることが難しくなるため、このように記述しました。 http:// stackoverflow。com/questions/3985214 /照会の対象となる要素の中のオブジェクト配列のmongodbコレクション –

+0

Javaドライバを使用して集計を行うことができます。 ;)そして、あなたがサブdocsにアクセスするためにm/rが必要であるとは思わない。 –

0

JSONオブジェクトは何の秩序を持たない配列をソート。 the specsセクション4.3.3:

オブジェクトはオブジェクト型のメンバーです。これは、それぞれが にプリミティブな値、オブジェクト、または関数を含むプロパティの順序付けられていないコレクションです。オブジェクトのプロパティに格納されている関数は、 メソッドと呼ばれます。

フィールドの順序に依存することはできませんが、保証されません。

関連する問題