1

Mongo にコレクションがあり、特定のキーに重複があり、1 つを除いてすべて削除する必要があります。Map Reduce ソリューションは、重複の 1 つを除いてすべてを削除する方法を明確にしていないようです。私はRubyを使用していますが、これをある程度効率的な方法で行うにはどうすればよいですか? 私の現在のソリューションは信じられないほど遅いです!

現在、重複キーの配列を繰り返し処理し、返された最初のドキュメントを削除するだけですが、これはキーごとに最大で 1 つの重複ドキュメントがあり、非常に遅い場合にのみ機能します。

dupes.each do |key|
    $mongodb.collection("some_collection").remove($mongodb.collection("some_collection").find({key: key}).first)
end
4

2 に答える 2

2

ensureIndex()MongoDBを使用して重複を削除する必要があると思います。たとえば、あなたの場合、重複したドキュメントを削除してキーを指定したい場合は、次のduplicate_keyことができます

db.duplicate_collection.ensureIndex({'duplicate_key' : 1},{unique: true, dropDups: true})

duplicate_collection重複したドキュメントがあるコレクションはどこにありますか。この操作では、特定のキーを指定する重複ドキュメントがある場合にのみ、単一のドキュメントが保持されます。

操作後、インデックスを削除したい場合は、dropIndex操作を行ってください。詳細については、mongodb のドキュメントを検索できます。

于 2013-04-15T10:49:55.617 に答える
0

多くのソリューションが Map Reduce を提案しています (これは高速で優れています) が、私は Ruby でソリューションを実装しました。これも非常に高速で、各重複セットから 1 つのドキュメントを簡単に残すことができます。

基本的に、すべての重複キーをハッシュに追加して見つけます。コレクション内に重複キーが見つかったら、そのドキュメントの ID を配列に追加します。これは、最後に一括削除で使用します。

all_keys = {}
dupes = []
    dupe_key = "some_key"

$mongodb.collection("some_collection").find.each do |doc|
   all_keys[doc[dupe_key]].present? ? dupes << doc["_id"] : asins[doc[dupe_key]] = 1
end

$mongodb.collection("some_collection").remove({_id: {"$in" => dupes } })

この方法の唯一の問題は、キー/重複 ID の合計リストをメモリに格納できない場合、機能しない可能性があることです。マップ削減ソリューションは、おそらくその時点で最適です。

于 2013-04-12T17:53:22.267 に答える