15

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

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

     }
  } finally {
     cursor.close();
  }

如何有效地更新具有不同值的巨大 MongoDB 集合的每个文档中的字段?

4

2 回答 2

22

你的方法基本正确。但是我不会认为这样的集合是“巨大的”你可以从 shell 运行类似的东西:

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}})

于 2013-04-12T11:34:47.937 回答
5

受@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();
    }
}
于 2013-04-13T19:31:15.457 回答