我在mongodb收集了md5.我想找到所有的副本.md5列被编入索引.你知道使用map reduce的快速方法吗.

我目前使用map reduce的方法对集合进行了几乎两次迭代(假设有非常少量的重复项):

res = db.files.mapReduce(
    function () {
        emit(this.md5, 1);
    }, 
    function (key, vals) {
        return Array.sum(vals);
    }
)

db[res.result].find({value: {$gte:1}}).forEach(
function (obj) {
    out.duplicates.insert(obj)
});

推荐答案

一次完成的最简单方法是按md5排序,然后进行适当的处理.

比如:

var previous_md5;
db.files.find( {"md5" : {$exists:true} }, {"md5" : 1} ).sort( { "md5" : 1} ).forEach( function(current) {

  if(current.md5 == previous_md5){
    db.duplicates.update( {"_id" : current.md5}, { "$inc" : {count:1} }, true);
  }

  previous_md5 = current.md5;

});

这个小脚本对md5条目进行排序,并按顺序循环.如果md5被重复,那么它们将在排序后"背对背".所以我们只需将指针保持在previous_md5,并将其与current.md5进行比较.如果我们发现了一个副本,我会将其放入duplicates集合(并使用$inc来计算副本的数量).

这个脚本意味着您只需循环一次主数据集.然后,您可以循环duplicates个集合并执行清理.

Mongodb相关问答推荐

MongoDB(Mongoose)条件判断没有像我预期的那样工作

我们可以在Mongoose中这样使用Unique:[True,";This to Unique&qot;]吗

MongoDB查询优化

为什么使用 Golang Mongo 驱动程序进行简单查询需要超过 2 秒?

如何在查找 foreignField 中使用通配符?

有没有办法在 Prisma for MongoDB 的模式中显式声明 int32?

如何聚合过滤器嵌套文档并从其他字段中获取值

MongoDB:插入重复键更新

更新文档中的数组时,如何在 MongoDB 和 C# 中使用 $push 更新修饰符

具有最佳插入/秒性能的数据库?

MongoDB 文档操作是原子的和隔离的,但它们是否一致?

Node.js 数据库的抽象层

Python - Pymongo 插入和更新文档

将 MongoDB 数据库复制到本地计算机

使用 MongoDB 的 map/reduce 来分组两个字段

mongodb 的计数性能

MongoDB 按数组元素对文档进行排序

Mongoid 不在查询中

MongoError:Can't extract geo keys from object

用 MongoDB 中的属性表示多对多关系的最佳模型