-->

Java中,MongoDB的:如何在迭代一个巨大的集合更新每个对象?(Java, MongoDB:

2019-08-22 06:37发布

我有大约100万条记录,每行20场集合。 我需要更新整数flag的每个记录(文件)在字段随机地分配1或2该flag字段。 如何做到这一点的同时迭代光标在整个集合? 这似乎不是一个好主意,搜索已经被发现的MongoDB只是为了能够更新对象第二次:

  DBCursor cursor = coll.find();
  try {
     while(cursor.hasNext()) {
    BasicDBObject obj = (BasicDBObject) cursor.next();
    ...
    coll.update(query,newObj)

     }
  } finally {
     cursor.close();
  }

如何将巨大的MongoDB的集合与效率的不同值的每个文档中更新某个域?

Answer 1:

你的做法是基本正确。 不过我不会考虑这样一个集合的“巨大”您可以从外壳类似的东西:

coll.find({}).forEach(function (doc) {
    doc.flag = Math.floor((Math.random()*2)+1);
    coll.save(doc);
 });

根据您的MongoDB的版本,配置和负载,这可能需要几分钟之间几个小时的东西

如果要执行散货此更新,查询文档中使用某些情况下,一些诸如coll.find({"aFiled" : {$gt : minVal}, "aFiled" : {$lt : maxVal}})



Answer 2:

我的解决办法,以我自己的问题,通过@orid启发:

public void tagAll(int min, int max) {
    int rnd = 0;
    DBCursor cursor = this.dataColl.find();
    try {
        while (cursor.hasNext()) {
            BasicDBObject obj = (BasicDBObject) cursor.next();
            rnd = min + (int) (Math.random() * ((max - min) + 1));
            obj.put("tag", rnd);
            this.dataColl.save(obj);
        }
    } finally {
        cursor.close();
    }
}


文章来源: Java, MongoDB: How to update every object while iterating a huge collection?