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コードを使用する以外に、これを行うより良い方法はありますか?これが最善/最も簡単な方法である場合、そうであると言い、この質問は誰かを助けるでしょう:)
この質問が尋ねられて回答された後、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集計への変換チャート ブックマークする価値があります。