我在Mongo中有一个集合,在一个特定的键上有重复项,我需要删除除其中一个之外的所有项。Map Reduce解决方案似乎没有清楚地说明如何删除除一个副本之外的所有副本。我正在使用Ruby,我如何才能以一种更有效的方式做到这一点呢?我现在的解决方案太慢了!
我目前只是迭代重复键的数组,并删除返回的第一个文档,但只有当每个键最多有一个重复文档时才有效,而且速度非常慢。
dupes.each do |key|
$mongodb.collection("some_collection").remove($mongodb.collection("some_collection").find({key: key}).first)
end发布于 2013-04-15 18:49:56
我认为您应该使用MongoDB ensureIndex()来删除重复项。例如,在您的示例中,您希望删除重复的文档,并指定关键字duplicate_key,您可以这样做
db.duplicate_collection.ensureIndex({'duplicate_key' : 1},{unique: true, dropDups: true})其中duplicate_collection是重复文档所在的集合。此操作仅在存在给定特定关键字的重复文档时才会保留单个文档。
操作完成后,如果您想删除索引,只需执行dropIndex操作即可。有关详细信息,可以搜索mongodb文档。
发布于 2013-04-13 01:53:22
很多解决方案都建议使用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 } })这种方法的唯一问题是,如果键/副本in的总列表不能存储在内存中,它可能无法工作。在这一点上,map reduce解决方案可能是最好的。
https://stackoverflow.com/questions/15977836
复制相似问题