MongoDB shell中无序批量更新记录

2024-03-18

我有一个包含数百万个文档的集合,类似于以下内容:

{
    _id: ObjectId('...'),
    value: "0.53"
    combo: [
        {
            h: 0,
            v: "0.42"
        },
        {
            h: 1,
            v: "1.32"
        }
    ]
}

问题是这些值存储为字符串,我需要将它们转换为浮点/双精度。

我正在尝试这个并且它正在工作,但是考虑到数据量,这将需要几天的时间才能完成:

db.collection.find({}).forEach(function(obj) { 
    if (typeof(obj.value) === "string") {
        obj.value = parseFloat(obj.value);
        db.collection.save(obj);
    }

     obj.combo.forEach(function(hv){
         if (typeof(hv.value) === "string") {
            hv.value = parseFloat(hv.value);
            db.collection.save(obj);
         }
     });
});

我在阅读 Mongo 文档时遇到了批量更新,我正在尝试这样做:

var bulk = db.collection.initializeUnorderedBulkOp();
bulk.find({}).update(
    { 
      $set: { 
                "value": parseFloat("value"), 
            }
    });
bulk.execute();

它运行...但我得到一个 NAN 作为值,这是因为它认为我正在尝试将“值”转换为浮点数。我尝试过不同的变体,例如this.value and "$value"但无济于事。另外,这种方法仅尝试更正另一个对象中的值,而不是数组中的值。

我将不胜感激任何帮助。提前致谢!


通过以下方式弄清楚了:

1)为了在文档级别进行转换,我遇到了这个帖子 https://stackoverflow.com/questions/30027608/mongodb-slow-update-loop马库斯的回复为我的解决方案铺平了道路:

var bulk = db.collection.initializeUnorderedBulkOp()
var myDocs = db.collection.find()
var ops = 0
myDocs.forEach(

  function(myDoc) {

    bulk.find({ _id: myDoc._id }).updateOne(
        { 
          $set : {
                "value": parseFloat(myDoc.value),
            } 
        }
    );

    if ((++ops % 1000) === 0){
      bulk.execute();
      bulk = db.collection.initializeUnorderedBulkOp();
    }

  }
)
bulk.execute();

2)第二部分涉及更新数组对象值,我在接受的答案中发现了这样做的语法这个帖子 https://stackoverflow.com/questions/16750391/mongodb-update-property-of-subarray-just-updates-the-first-element。就我而言,我知道有 24 个值,我与第一个查询分开运行,结果如下所示:

var bulk = db.collection.initializeUnorderedBulkOp()
var myDocs = db.collection.find()
var ops = 0
myDocs.forEach(

  function(myDoc) {

    bulk.find({ _id: myDoc._id }).update(
        { 
          $set : { 
                "combo.0.v": parseFloat(myDoc.combo[0].v),
                "combo.1.v": parseFloat(myDoc.combo[1].v),
                "combo.2.v": parseFloat(myDoc.combo[2].v),
                "combo.3.v": parseFloat(myDoc.combo[3].v),
                "combo.4.v": parseFloat(myDoc.combo[4].v),
                "combo.5.v": parseFloat(myDoc.combo[5].v),
                "combo.6.v": parseFloat(myDoc.combo[6].v),
                "combo.7.v": parseFloat(myDoc.combo[7].v),
                "combo.8.v": parseFloat(myDoc.combo[8].v),
                "combo.9.v": parseFloat(myDoc.combo[9].v),
                "combo.10.v": parseFloat(myDoc.combo[10].v),
                "combo.11.v": parseFloat(myDoc.combo[11].v),
                "combo.12.v": parseFloat(myDoc.combo[12].v),
                "combo.13.v": parseFloat(myDoc.combo[13].v),
                "combo.14.v": parseFloat(myDoc.combo[14].v),
                "combo.15.v": parseFloat(myDoc.combo[15].v),
                "combo.16.v": parseFloat(myDoc.combo[16].v),
                "combo.17.v": parseFloat(myDoc.combo[17].v),
                "combo.18.v": parseFloat(myDoc.combo[18].v),
                "combo.19.v": parseFloat(myDoc.combo[19].v),
                "combo.20.v": parseFloat(myDoc.combo[20].v),
                "combo.21.v": parseFloat(myDoc.combo[21].v),
                "combo.22.v": parseFloat(myDoc.combo[22].v),
                "combo.23.v": parseFloat(myDoc.combo[23].v)
          }
        }
    );

    if ((++ops % 1000) === 0){
      bulk.execute();
      bulk = db.collection.initializeUnorderedBulkOp();
    }

  }
)
bulk.execute();

只是为了提供有关性能的想法,forEach每分钟检查大约 900 个文档,实际上,对于 1500 万条记录来说,这需要几天时间!不仅如此,这只是在文档级别转换类型,而不是数组级别。为此,我必须循环遍历每个文档并循环遍历每个数组(1500 万次 x 24 次迭代)!通过这种方法(并行运行两个查询),它在 6 小时内完成了这两个查询。

我希望这对其他人有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB shell中无序批量更新记录 的相关文章

  • 如何获取 bson 文档的大小(以字节为单位)

    bson文档的size 函数返回的int值是字节数吗 无法找到此 API 的详细信息 如何获取 bson 文档的大小 以字节为单位 这是我的代码 import org bson Document MongoDatabase db Mongo
  • Mongoose 查询:删除“_id”属性,在结果中保留虚拟属性“id”

    我正在运行 Express js 应用程序 并且有以下设置 模型 js var schemaOptions toJSON virtuals true toObject virtuals true var modelSchema new mo
  • MongoDB $geoIntersects 不适用于包含负顶点的多边形

    我已在数据库中存储了跨越 x 轴和 y 轴的多边形 并且我想搜索包含给定点的多边形 为此 我使用 geoIntersects 运算符来指定一个点 但是 当多边形穿过轴时 MongoDB 不会返回任何多边形 我可以对查询或架构进行任何小的更改
  • 如何更改 MongoDB 用户权限?

    例如 如果我有这个用户 gt db system users find user testAdmin pwd some hash roles clusterAdmin otherDBRoles TestDB readWrite 我想给那个用
  • Mongodb 限制聚合查询中的数组

    我正在尝试编写一个查询来返回每个类别中的前 X 个术语 例如前 5 个 前 10 个等 每个术语都有一个关联的类别 并且基于另一个术语的帮助堆栈溢出问题 https stackoverflow com questions 25666187
  • Java MongoDB 获取子文档的值

    我试图从子文档中获取键的值 但我似乎无法弄清楚如何使用 BasicDBObject get 函数 因为键嵌入了两层深度 这是文档的结构 File name file 1 report name report 1 group RnD 基本上一
  • 如何使用 Stripe 在一次操作中创建客户和卡片?

    我正在尝试第一次初始化客户 我有一个表格 他们可以在那里注册和填写所有内容 然后他们提交 在客户端上 会发生以下情况 var cardValues AutoForm getFormValues credit card form insert
  • Mongodb - 为现有集合添加架构

    我的 MongoDB 中有一个包含 1300 万条记录的集合 不幸的是 当我创建这个集合时 没有为其创建模式 我想知道除了备份整个数据库 创建架构并上传所有数据之外 是否有任何方法可以添加 JSON 架构 您可以使用以下方法将 JSON 架
  • 使用 Tweepy 获取推文时出错

    我有一个用于获取推文的 Python 脚本 在脚本中我使用该库 Tweepy 我使用有效的身份验证参数 运行此脚本后 一些推文存储在我的 MongoDB 中 有些则被 if 语句拒绝 但我仍然收到错误 requests packages u
  • Pymongo 批量插入

    我正在尝试批量插入文档 但批量插入时不会插入超过 84 个文档 给我这个错误 in insert pymongo errors InvalidOperation cannot do an empty bulk insert 是否可以批量插入
  • Mongoose.js instance.save() 回调未触发

    var mongo require mongoose var connection mongo createConnection mongodb 127 0 0 1 test connection on error function err
  • 使用填充方法在 sails mongo 中进行深层关联?

    我是 sails js 的新手 我正在使用 sails js 与 Mongodb 我在我的 sails 应用程序中使用 populate 进行深层关联时遇到问题 我有这样的关系 Category has many to many relat
  • spring-data-mongodb 在重新水化对象时到底如何处理构造函数?

    我读过了http static springsource org spring data data mongo docs 1 1 0 RELEASE reference html mapping chapter http static sp
  • MongoDB:检查值是否为空或数组是否为空

    我想匹配所有不包含 公司 属性或 公司 值为空或空数组的文档 User find Company in null function err users if err throw err console log users length th
  • MongoDB 过滤嵌套对象中的数组元素

    我有一个文件如下 id ObjectId 56423b2558cb340599108b35 test source member abc member xyz 我想过滤数组元素 xyz 并且我正在尝试以下查询 db coll find te
  • NestJs/Mongoose 中的自动递增序列

    我正在将 NodeJs 项目迁移到 NestJs 该项目使用 MongoDB 作为后端数据库 使用 Mongoose 作为 ODM 我当时用的是猫鼬序列 https github com ramiel mongoose sequence插件
  • 如何更新 Laravel 编辑视图中的图像?

    在 Laravel 中 我的编辑视图中有一个名为 个人资料图片 的字段 每当我单击 编辑 按钮时 我都会在编辑视图中从数据库中获取所有值 但没有获得图像 并且如果每当我每次单击 提交 按钮时 我都必须如果没有上传图像 我无法进一步处理我想要
  • 调用 Mongoose 插件内模式的静态方法

    我写了一个插件 可以执行以下操作 module exports function schema options schema statics customFunction function criteria Code 这是我的架构 var
  • 在 MongoDB 查询中,负限制是什么意思?

    我正在使用 Mongoid ruby gem 与 MongoDB 进行交互 当我尝试从查询中获取某些内容时 它会添加 limit 1 即负数 当我希望它只使用1 我尝试在控制台中执行相同的操作 但它没有更改返回的文档 负数限制是否意味着什么
  • 如何在 Meteor 应用程序之间共享 MongoDB 集合?

    我希望能够为我的项目提供一个管理应用程序和一个客户端应用程序 理想情况下 我希望能够拥有一个共享的 MongoDB 集合 我怎样才能做到这一点 我尝试在两个不同的应用程序中创建具有相同名称的集合 但发现 Meteor 会将数据分开 知道我能

随机推荐