映射缩小以删除重复项(mongodb)

时间:2014-01-13 11:40:46

标签: mongodb mapreduce pymongo

我创建了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}

2 个答案:

答案 0 :(得分:2)

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

例如,假设字段名称为url

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

dropDups documentation的重要提示:

  

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

答案 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);