Java, MongoDB : How to update every object while iterating a huge collection?

标签 java mongodb updating

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

最佳答案

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

关于Java, MongoDB : How to update every object while iterating a huge collection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15969592/

相关文章:

web-deployment - 部署网站更新的原子方式?

mysql - 查询mysql更新库存问题

java - 错误 java.lang.IllegalArgumentException : Invalid token character '/' in token "multipart/form-data"

node.js - Mongoose $near 填充被忽略

django - sshtunnel.BaseSSHTunnelForwarder 无法与 SSH 网关建立 session

javascript - Mongodb findOne - 返回值

google-app-engine - 如何着手更新 GAE SDK?

java - 使用 GridView 启动应用程序时窗口已满

java - 有没有办法在 Java 中做部分类(比如 C#)?

Scanner.nextint() 上的 Java 空指针异常