映射减少以删除重复项(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 将在创建索引时从集合中删除这些文档。如果将dropDups
与sparse
选项结合使用,则该索引将仅包含索引中具有该值的文档,而没有该字段的文档将保留在数据库中。
【讨论】:
【参考方案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)的主要内容,如果未能解决你的问题,请参考以下文章