Một phương pháp thay thế là sử dụng khung tổng hợp
có hiệu suất tốt hơn so với giảm bản đồ. Hãy xem xét đường dẫn tổng hợp sau đây là giai đoạn đầu tiên của đường dẫn tổng hợp, $group
toán tử nhóm các tài liệu theo ID
và lưu trữ trong unique_ids
mỗi trường _id
giá trị của các bản ghi được nhóm bằng cách sử dụng mã <> $ addToSet
nhà điều hành. $ sum
toán tử bộ tích lũy cộng các giá trị của các trường được chuyển cho nó, trong trường hợp này là hằng số 1 - do đó đếm số bản ghi được nhóm vào trường đếm. Bước quy trình khác $ match
lọc các tài liệu có số lượng ít nhất là 2, tức là các bản sao.
Khi bạn nhận được kết quả từ tổng hợp, bạn lặp lại con trỏ để loại bỏ _id
đầu tiên trong unique_ids
, sau đó đẩy phần còn lại vào một mảng sẽ được sử dụng sau này để xóa các phần trùng lặp (trừ một mục nhập):
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}})