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

我收集了大约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集合的每个文档中的字段?

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