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

Java,MongoDB:如何在迭代一个庞大的集合时更新每个对象?,java,mongodb,updating,Java,Mongodb,Updating,我收集了大约100万条记录,每个记录有20个字段。我需要更新每个记录(文档)中的整型标志字段,将1或2随机分配给该标志字段。 在整个集合上迭代光标时如何执行此操作?第二次搜索MongoDB已经找到的对象以更新它似乎不是一个好主意: DBCursor cursor = coll.find(); try { while(cursor.hasNext()) { BasicDBObject obj = (BasicDBObject) cursor.next(); ...

我收集了大约100万条记录,每个记录有20个字段。我需要更新每个记录(文档)中的整型
标志
字段,将1或2随机分配给该
标志
字段。 在整个集合上迭代光标时如何执行此操作?第二次搜索MongoDB已经找到的对象以更新它似乎不是一个好主意:

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

     }
  } finally {
     cursor.close();
  }

如何使用不同的值高效地更新大型MongoDB集合中每个文档中的字段

你的方法基本上是正确的。 但是我不认为这样的收藏是“巨大的” 您可以从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})

我自己问题的解决方案,灵感来自@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();
    }
}

您可以在单个查询中更新所有文档(与特定条件匹配),“update”命令中的“multi”标志设置为true。选中此项:我无法使用
multi
标志,因为我使用唯一值更新每个文档。这与使用同一个值更新多个文档不同。我已经回答了。希望有帮助。在我的方法中,每个文档都会被MongoDB搜索两次。这有意义吗?我的修正函数将其简化为单个游标查询,您不需要在每次迭代中进行额外的查询。如您所见,我使用
coll.save(doc)
这有问题:如果您使用的是大量集合,请参阅不要忘记添加
noCursorTimeout()
!否则,该命令将在10分钟后超时(至少对我是这样)。因此Ori的答案的顶行变成:
coll.find({}).noCursorTimeout().forEach(函数(doc){