我创建了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}
答案 0 :(得分:2)
假设您不关心删除哪个副本,一种简单的方法是确保使用dropDups:true
的唯一索引。
例如,假设字段名称为url
:
db.collection.ensureIndex( { url: 1 }, { unique: true, dropDups: true } )
dropDups
documentation的重要提示:
与所有唯一索引一样,如果文档没有索引字段,MongoDB会将其包含在索引中,并带有“null”值。 如果后续字段没有索引字段,并且您已设置
{dropDups: true}
,则MongoDB将在创建索引时从集合中删除这些文档。如果将dropDups
与sparse
选项组合使用,则此索引将仅包含索引中具有该值的文档,而没有该字段的文档将保留在数据库中。
答案 1 :(得分:0)
您可以编写一个小应用程序来执行此操作,即在shell中:
db.my_results.find().forEach(function(doc){
if(doc.value > 1)
db.realCollection.remove({_id: doc._id}, true);
});
结束true
只删除一次
添加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);