Ant*_*nin 15 java updating 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();
}
Run Code Online (Sandbox Code Playgroud)
如何有效地更新具有不同值的巨大MongoDB集合的每个文档中的字段?
Ori*_*Dar 21
你的方法基本上是正确的.但是我不认为这样的集合是"巨大的"你可以从shell运行类似的东西:
coll.find({}).forEach(function (doc) {
doc.flag = Math.floor((Math.random()*2)+1);
coll.save(doc);
});
Run Code Online (Sandbox Code Playgroud)
根据您的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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17691 次 |
| 最近记录: |