別のアプローチは、 集約フレームワーク
>
これはmap-reduceよりも優れたパフォーマンスを発揮します。次の集約パイプラインについて考えてみます。これは、集約パイプラインの最初のステージとして、 $ group
オペレーターはドキュメントをID
でグループ化します フィールドとunique_ids
に格納します 各_id
のフィールド $ addToSet
オペレーター。 $ sum
>
アキュムレータ演算子は、渡されたフィールドの値(この場合は定数1)を合計します。これにより、グループ化されたレコードの数がカウントフィールドにカウントされます。もう1つのパイプラインステップ $ match
集計から結果を取得したら、カーソルを繰り返して最初の _id
を削除します unique_ids
内 フィールドに入力し、残りを配列にプッシュします。この配列は、後で重複を削除するために使用されます(マイナス1エントリ):
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}})