एक वैकल्पिक तरीका एकत्रीकरण ढांचे
जिसमें मैप-रिड्यूस की तुलना में बेहतर प्रदर्शन है। निम्नलिखित एकत्रीकरण पाइपलाइन पर विचार करें, जो एकत्रीकरण पाइपलाइन के पहले चरण के रूप में, $group
ऑपरेटर दस्तावेज़ों को ID
. द्वारा समूहित करता है unique_ids
. में फ़ील्ड और स्टोर करें प्रत्येक को फ़ील्ड करें _id
$addToSet
ऑपरेटर। $sum
संचायक ऑपरेटर इसे पास किए गए क्षेत्रों के मूल्यों को जोड़ता है, इस मामले में निरंतर 1 - जिससे गिनती क्षेत्र में समूहीकृत रिकॉर्ड की संख्या की गणना होती है। अन्य पाइपलाइन चरण $match
कम से कम 2, यानी डुप्लिकेट की गिनती वाले दस्तावेज़ों को फ़िल्टर करता है।
एक बार जब आप एकत्रीकरण से परिणाम प्राप्त कर लेते हैं, तो आप पहले _id
को निकालने के लिए कर्सर को पुनरावृत्त करते हैं unique_ids
. में फ़ील्ड, फिर बाकी को एक सरणी में धकेलें जिसका उपयोग बाद में डुप्लिकेट को हटाने के लिए किया जाएगा (माइनस वन एंट्री):
cursor = db.coll.aggregate(
[
{"$group": {"_id": "$ID", "unique_ids": {"$addToSet": "$_id"}, "count": {"$sum": 1}}},
{"$match": {"count": { "$gte": 2 }}}
]
)
response = []
for doc in cursor:
del doc["unique_ids"][0]
for id in doc["unique_ids"]:
response.append(id)
coll.remove({"_id": {"$in": response}})