Pendekatan alternatif adalah dengan menggunakan aggregation framework
yang memiliki kinerja lebih baik daripada pengurangan peta. Pertimbangkan pipa agregasi berikut yang sebagai tahap pertama dari pipa agregasi, $group
operator mengelompokkan dokumen menurut ID
bidang dan simpan di unique_ids
kolom setiap _id
nilai catatan yang dikelompokkan menggunakan $addToSet
operator. $sum
operator akumulator menjumlahkan nilai bidang yang diteruskan ke sana, dalam hal ini konstanta 1 - dengan demikian menghitung jumlah catatan yang dikelompokkan ke dalam bidang penghitungan. Langkah pipa lainnya $match
menyaring dokumen dengan hitungan minimal 2, yaitu duplikat.
Setelah Anda mendapatkan hasil dari agregasi, Anda mengulangi kursor untuk menghapus _id
pertama di unique_ids
bidang, lalu dorong sisanya ke dalam larik yang akan digunakan nanti untuk menghapus duplikat (dikurangi satu entri):
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}})