受け入れられた答えは、大きなコレクションではひどく遅く、_id
を返しません 重複するレコードのs。
集計ははるかに高速で、_id
を返すことができます s:
db.collection.aggregate([
{ $group: {
_id: { name: "$name" }, // replace `name` here twice
uniqueIds: { $addToSet: "$_id" },
count: { $sum: 1 }
} },
{ $match: {
count: { $gte: 2 }
} },
{ $sort : { count : -1} },
{ $limit : 10 }
]);
集約パイプラインの最初の段階では、$groupoperatorはname
によってドキュメントを集約します。 フィールドとuniqueIds
に保存 各_id
グループ化されたレコードの値。$sum演算子は、渡されたフィールドの値(この場合は定数1
)を合計します。 -これにより、グループ化されたレコードの数をcount
にカウントします フィールド。
パイプラインの第2段階では、$ matchを使用して、count
でドキュメントをフィルタリングします。 少なくとも2つ、つまり重複している。
次に、最も頻繁な重複を最初に並べ替え、結果を上位10に制限します。
このクエリは最大$limit
を出力します 重複する名前のレコードとその_id
s。例:
{
"_id" : {
"name" : "Toothpick"
},
"uniqueIds" : [
"xzuzJd2qatfJCSvkN",
"9bpewBsKbrGBQexv4",
"fi3Gscg9M64BQdArv",
],
"count" : 3
},
{
"_id" : {
"name" : "Broom"
},
"uniqueIds" : [
"3vwny3YEj2qBsmmhA",
"gJeWGcuX6Wk69oFYD"
],
"count" : 2
}