स्वीकृत उत्तर बड़े संग्रह पर बहुत धीमा है, और _id नहीं लौटाता है डुप्लिकेट रिकॉर्ड के s.
एकत्रीकरण बहुत तेज़ है और _id लौटा सकता है रों:
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 . में गिनना फ़ील्ड.
पाइपलाइन के दूसरे चरण में, हम count . के साथ दस्तावेज़ों को फ़िल्टर करने के लिए $match का उपयोग करते हैं कम से कम 2, यानी डुप्लीकेट।
फिर, हम सबसे अधिक बार होने वाले डुप्लिकेट को पहले सॉर्ट करते हैं, और परिणामों को शीर्ष 10 तक सीमित करते हैं।
यह क्वेरी $limit . तक आउटपुट होगी उनके _id . के साथ डुप्लीकेट नामों वाले रिकॉर्ड एस। उदाहरण के लिए:
{
"_id" : {
"name" : "Toothpick"
},
"uniqueIds" : [
"xzuzJd2qatfJCSvkN",
"9bpewBsKbrGBQexv4",
"fi3Gscg9M64BQdArv",
],
"count" : 3
},
{
"_id" : {
"name" : "Broom"
},
"uniqueIds" : [
"3vwny3YEj2qBsmmhA",
"gJeWGcuX6Wk69oFYD"
],
"count" : 2
}