web-dev-qa-db-ja.com

MongoDB GROUP BYでHAVINGを実行する正しい方法は何ですか?

SQLでこのクエリはどうなるか(重複を見つけるため):

SELECT userId, name FROM col GROUP BY userId, name HAVING COUNT(*)>1

MongoDBで次の簡単なクエリを実行しました。

res = db.col.group({key:{userId:true,name:true}, 
                     reduce: function(obj,prev) {prev.count++;}, 
                     initial: {count:0}})

次のように、単純なJavascriptループを追加して結果セットを調べ、カウントが1より大きいすべてのフィールドを検索するフィルターを実行しました。

for (i in res) {if (res[i].count>1) printjson(res[i])};

クライアントでJavaScriptコードを使用する以外に、これを行うより良い方法はありますか?これが最善/最も簡単な方法である場合、そうであると言い、この質問は誰かを助けるでしょう:)

29
shlomoid

Mongo集約フレームワークを使用した新しい答え

この質問が尋ねられて回答された後、10genは、集約フレームワークを備えたMongodbバージョン2.2をリリースしました。このクエリを実行する新しい最良の方法は次のとおりです。

db.col.aggregate( [
   { $group: { _id: { userId: "$userId", name: "$name" },
               count: { $sum: 1 } } },
   { $match: { count: { $gt: 1 } } },
   { $project: { _id: 0, 
                 userId: "$_id.userId", 
                 name: "$_id.name", 
                 count: 1}}
] )

10genには便利な SQLからMongo集計への変換チャート ブックマークする価値があります。

50
Old Pro