【问题标题】:Map reduce to delete duplicates (mongodb)映射减少以删除重复项(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}

【问题讨论】:

    标签: mongodb mapreduce pymongo


    【解决方案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 代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 2012-11-11
      • 2011-12-12
      • 2021-02-05
      • 1970-01-01
      • 2021-03-22
      • 2018-04-25
      相关资源
      最近更新 更多