1

我在 Mongo 中有一个集合,其中包含一个特定键的重复项,我需要删除除一个之外的所有键。Map Reduce 解决方案似乎没有明确说明如何删除除一个重复项之外的所有重复项。我正在使用 Ruby,我怎样才能以某种有效的方式做到这一点?我目前的解决方案慢得令人难以置信!

我目前只是遍历重复键的数组并删除返回的第一个文档,但这仅在每个键最多有 1 个重复文档且速度非常慢的情况下才有效。

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

2 回答 2

2

我认为您应该使用 MongoDBensureIndex()删除重复项。例如,在您的情况下,您想删除重复的文档给 key 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 中实现了一个解决方案,它看起来也非常快,并且可以很容易地从每个重复集中留下一个文档。

基本上,您通过将所有重复键添加到哈希中来找到所有重复键,并且每当您在集合中找到重复键时,您将该文档的 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 的总列表存储在内存中,它可能无法工作。在这一点上,map reduce 解决方案可能是最好的。

于 2013-04-12T17:53:22.267 回答