1

集約フレームワークを使用して、多くの文字列をグループ化し、一意のものを識別しようとしています。残りのフィールドに関する情報も保持する必要があります。これは、mysql で group by ステートメントで * 演算子を使用することに似ています。

SELECT * 
FROM my_table
GROUP BY field1 

集計フレームワークを使用してみましたが、一意のフィールドを取得するだけでうまく機能します。

db.mycollection.aggregate({ 
    $group : { _id : "$field1"}
    })

それに付随する他のフィールドが必要な場合はどうなりますか。MySQL は、グループに最初に表示されたもののみを提供します (これで問題ありません)。それが $first 演算子が行ったと私が思ったことです。

db.mycollection.aggregate({
  $group : { 
       _id : "$field1",
       another_field : {$first : "$field2"}
  }})

このように、field1 でグループ化しますが、ドキュメントに添付された他のフィールドも表示されます。これを試すと、次のようになります。

 exception: aggregation result exceeds maximum document size (16MB)

私が感じているのは、集計全体を 1 つのドキュメントとして返すためです。別のjson配列として返すことはできますか?

前もって感謝します

4

3 に答える 3

3

集計を正しく行っていますが、エラー メッセージが示すように、呼び出しの完全な結果aggregateは16 MB を超えることはできません。

回避策は、フィルタを追加して結果のサイズを縮小するか、代わりに map-reduce を使用して結果を別のコレクションに出力することです。

于 2012-12-27T01:21:30.080 に答える
2

結果の一意の値が 2000 を超えない場合は、次のような group() 関数を使用できます

db.mycollection.group( {key : {field1 : 1, field2 : 1}}, reduce: function(curr, result){}, initial{} })

最後のオプションは map reduce です:

db.mycollection.mapReduce( function() { emit( {field1 :1, field2: 1}, 1); }, function(key, values) { return 1;}, {out: {replace: "unique_field1_field2"}})

結果は「unique_field1_field2」コレクションになります

于 2013-03-04T23:06:25.537 に答える
1

別の方法として、次のdistinct関数を使用します。

db.mycollection.distinct('field1')

この関数は、ドキュメントをフィルタリングできる 2 番目の引数であるクエリを受け入れます。

于 2012-12-27T01:24:44.893 に答える