Java,MongoDB:如何在迭代一个庞大的集合时更新每个对象?
我收集了大约100万条记录,每个记录有20个字段。我需要更新每个记录(文档)中的整型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(); ...
标志
字段,将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){