映射减少以删除重复项(mongodb)

Posted

技术标签:

【中文标题】映射减少以删除重复项(mongodb)【英文标题】:Map reduce to delete duplicates (mongodb) 【发布时间】:2014-02-01 03:30:07 【问题描述】:

我创建了 map reduce 函数来获取所有文档及其计数。 我现在需要删除所有重复项。我该怎么做?

 res = col.map_reduce(map,reduce,"my_results");

提供如下输出:

u'_id': u'http://www.hardassetsinvestor.com/features/5485-soft-commodity-q4-report-low-inventories-buoy-cocoa-growing-stocks-weigh-on-coffee-cotton-a-sugar.html', u'value': 2.0
u'_id': u'http://www.hardassetsinvestor.com/market-monitor-archive/5490-week-in-review-gold-a-silver-kick-off-2014-strongly-oil-a-natgas-stall.html', u'value': 2.0

【问题讨论】:

【参考方案1】:

假设您不关心删除了哪个重复项,一个简单的方法是使用 dropDups:true 确保唯一索引。

例如,假设字段名称为url

db.collection.ensureIndex(  url: 1 ,  unique: true, dropDups: true  )

来自dropDups documentation的重要说明:

与所有唯一索引一样,如果文档没有索引字段,MongoDB 会将其包含在索引中,并带有“null”值。 如果后续字段没有索引字段,并且您设置了dropDups: true,MongoDB 将在创建索引时从集合中删除这些文档。如果将dropDupssparse 选项结合使用,则该索引将仅包含索引中具有该值的文档,而没有该字段的文档将保留在数据库中。

【讨论】:

【参考方案2】:

您将编写一个小应用程序来执行此操作,即在 shell 中:

db.my_results.find().forEach(function(doc)
    if(doc.value > 1)
        db.realCollection.remove(_id: doc._id, true);
);

结尾true 使得remove 只删除一次

编辑

由于上面的代码很难翻译,所以添加 Python:

for doc in db.my_results.find():
    if doc.value > 1:
        for i in range(0, doc.value):
            db.realCollection.remove('_id': doc._id, true);

【讨论】:

我不能用python脚本(pymongo)写这个吗? @wannaC 当然,我目前对 python 不太了解 这里的mrcollection是什么? @wannaC 实际上是 my_results @wannaC-编辑问题以包含您不起作用的 python 代码。

以上是关于映射减少以删除重复项(mongodb)的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 使用 ensureIndex 删除重复项,但保留最后一个条目而不是第一个条目

Java 8 Streams 减少删除重复项,保留最新条目

删除嵌套组中的重复项

从 mongodb 数组中的所有重复项中拉出一个元素

删除数组中的重复项,但添加一个计数属性以查看重复项的数量

修改 CLOB 以删除重复项