如何更改Mongo文档中嵌套字段的数据类型?

2024-01-15

我的 Mongo 结构如下,

"topProcesses" : [
        {
            "cpuUtilizationPercent" : "0.0",
            "processId" : "1",
            "memoryUtilizationPercent" : "0.1",
            "command" : "init",
            "user" : "root"
        },
        {
            "cpuUtilizationPercent" : "0.0",
            "processId" : "2",
            "memoryUtilizationPercent" : "0.0",
            "command" : "kthreadd",
            "user" : "root"
        },
        {
            "cpuUtilizationPercent" : "0.0",
            "processId" : "3",
            "memoryUtilizationPercent" : "0.0",
            "command" : "ksoftirqd/0",
            "user" : "root"
        },
        {
            "cpuUtilizationPercent" : "0.0",
            "processId" : "5",
            "memoryUtilizationPercent" : "0.0",
            "command" : "kworker/0:+",
            "user" : "root"
        },
        {
            "cpuUtilizationPercent" : "0.0",
            "processId" : "6",
            "memoryUtilizationPercent" : "0.0",
            "command" : "kworker/u3+",
            "user" : "root"
        },
        {
            "cpuUtilizationPercent" : "0.0",
            "processId" : "8",
            "memoryUtilizationPercent" : "0.0",
            "command" : "rcu_sched",
            "user" : "root"
        } 
    ]

现在在上面的文件中topProcesses.cpuUtilizationPercent是字符串,我想改变topProcesses.cpuUtilizationPercent数据类型为Float。为此我在下面尝试过但没有成功

db.collectionName.find({
   "topProcesses":{"$exists":true}}).forEach(function(data){
    for(var ii=0;ii<data.topProcesses.length;ii++){
   db.collectionName.update({_id: data._id},{$set:{"topProcesses.$.cpuUtilizationPercent":parseFloat(data.topProcesses[ii].cpuUtilizationPercent)}},false,true);
  }
})

任何人都可以帮助如何将字符串更改为在嵌套 Mongo 文档中浮动


您以正确的方式执行此操作,但没有在查询部分中包含要匹配的数组元素.update():

db.collectionName.find({
   "topProcesses":{"$exists":true}}).forEach(function(data){
    for(var ii=0;ii<data.topProcesses.length;ii++) {
      db.collectionName.update(
         { 
             "_id": data._id, 
             "topProcesses.processId": data.topProcesses[ii].processId // corrected
         },
         {
             "$set": {
               "topProcesses.$.cpuUtilizationPercent":
                   parseFloat(data.topProcesses[ii].cpuUtilizationPercent)
             }
         }
      );
  }
})

所以你需要匹配数组中的某些内容才能位置性的$ http://docs.mongodb.org/manual/reference/operator/update/positional/运算符有任何影响。

您也可以在符号中使用“索引”值,因为无论如何您都是在循环中生成该值:

db.collectionName.find({
   "topProcesses":{"$exists":true}}).forEach(function(data){
    for(var ii=0;ii<data.topProcesses.length;ii++) {

      var updoc =  { 
          "$set": {}
      };

      var myKey = "topProcesses." + ii + ".cpuUtilizationPercent";
      updoc["$set"][myKey] = parseFloat(data.topProcesses[ii].cpuUtilizationPercent);

      db.collectionName.update(
         { 
             "_id": data._id
         },
         updoc
      );
  }
})

它仅使用匹配索引,并且在数组元素没有唯一标识符的情况下很方便。

另请注意,由于处理现有文档的性质,“upsert”或“multi”选项都不适用于此。


正如对此的“后记”注释一样,也值得考虑 2.6 及更高版本中的 MongoDB 批量操作 API。使用这些 API 方法,您可以显着减少客户端应用程序和数据库之间的网络流量。这里明显的改进是整体速度:

var bulk = db.collectionName.initializeOrderedBulkOp();
var counter = 0;

db.collectionName.find({
   "topProcesses":{"$exists":true}}
).forEach(function(data){
    for(var ii=0;ii<data.topProcesses.length;ii++) {

      var updoc =  { 
          "$set": {}
      };

      var myKey = "topProcesses." + ii + ".cpuUtilizationPercent";
      updoc["$set"][myKey] = parseFloat(data.topProcesses[ii].cpuUtilizationPercent);

      // queue the update
      bulk.find({ "_id": data._id }).update(updoc);
      counter++;

      // Drain and re-initialize every 1000 update statements
      if ( counter % 1000 == 0 ) {
          bulk.execute();
          bulk = db.collectionName.initializeOrderedBulkOp();
      }
  }
})

// Add the rest in the queue
if ( counter % 1000 != 0 )
    bulk.execute();

这基本上减少了发送到服务器的操作语句数量,每 1000 个排队操作只发送一次。您可以使用该数字以及事物的分组方式,但它将以相对安全的方式显着提高速度。

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

如何更改Mongo文档中嵌套字段的数据类型? 的相关文章

  • MongoDB insertMany 并跳过重复项

    我试图insertMany https docs mongodb com manual reference method db collection insertMany 项目进入我的 Mongo 数据库 但我想跳过重复的 ID 我在用着N
  • 国外收藏的查找和排序

    所以我有一个收藏users 并且此集合中的每个文档以及其他属性都有另一个集合中文档的 id 数组 workouts 集合中的每个文档workouts有一个名为date 这就是我想要得到的 对于特定用户 我想要获取属于该用户的锻炼的 work
  • Django:无法为用于检索数据的模型实例化抽象模型

    我正在开发一个项目 该项目有一个 Djongo 抽象模型和一个主模型 当我尝试插入一个值时 它被插入而没有错误 但是当我尝试检索数据时 我得到 抽象模型无法实例化 这是我的模型 class Exam questions models Mod
  • mongodb使用skip和limit排序不根据索引对记录进行排序

    我正在尝试使用 Mongodb 进行分页skip and limit 我想要按顺序获取页面记录register time 在数据库中 记录是按索引排序的 而不是按register time 如何使多页记录 多次跳转 遵循相同的内容regis
  • Mongoose 总是返回空数组? [复制]

    这个问题在这里已经有答案了 我是nodejs i的新手 我已经有一个名为aqi的数据库 集合名称为pln 我试图在网页上显示集合中的所有记录 但猫鼬总是返回空数组 我已经用其他数据库测试了它 但我可以从它们获取数据 但对于 pln mong
  • 如何使用 ejs post 表单更新 node.js 和 MongoDB 应用程序中的现有用户数据?

    我对 javascript 非常陌生 发现 Brad Traversy 的视频 Node js with Passport Authentication 并关注了他的视频 它对我有用 但后来我想添加更多 我创建了自定义仪表板和导航 我添加的
  • 由于类型错误无法创建索引:格式字符串参数不足

    我正在尝试使用 pymongo 创建索引 但因错误而失败 File D Users Dims Design EnergentGroup Python GIS Developer worker Approach03 sentinel mong
  • 何时对 MongoDB 集合调用 EnsureIndex?

    我什么时候应该打电话ensureIndex 插入单条记录之前 插入单条记录之后 或者调用之前find 看来我的评论有点被误解了 所以我会澄清一下 当你调用它时并不重要只要在第一次调用 find 之前的某个时刻调用它即可 换句话说 什么时候创
  • CORS 问题。 Flask <-> AngularJS

    使用 angularjs 客户端应用程序和提供 api 的 Flask 应用程序启动一个新项目 我使用 mongodb 作为数据库 我必须立即排除 jsonp 因为我需要能够跨不同端口进行 POST 因此 我们为 Angular 应用程序设
  • 更快地识别对象嵌套数组中具有重复字段的文档的方法

    我正在搜索更快的选项来将文档与嵌套数组内的字段中的重复值进行匹配 示例文档匹配条件 key 2 a p id 2 id 3 id 3 我需要找到更快的方法来仅匹配具有重复 a p id 值的文档 在带有 key 2 的示例文档中具有重复的
  • mongodb 无法在 ubuntu 18.04 上启动

    我在 Windows 10 上运行 ubuntu 18 04 我在 cli 上运行 mongod mongodb 正常启动 然后我尝试运行 mongo 并收到此错误 MongoDB shell version v4 0 2 connecti
  • MongoDB/PyMongo:如何在 Map 函数中使用点表示法?

    我正在尝试计算每个邮政编码中找到的记录数 在我的 MongoDB 中 嵌入了邮政编码 使用点表示法 它位于 a res z a 代表地址 res 代表住宅 z 代表邮政编码 例如 这工作得很好 db NY count a res z 141
  • MongoDB - 两个多边形的地理空间交集

    有没有什么方法可以使用符合以下条件的 mongodb 地理空间查询来查询和获取位置数据 获取属于两个框或一般两个多边形之间相交部分的所有位置 例如下面的示例 我们是否可以在查询输出中仅获取黄色区域内的那些位置 该区域实际上是紫色和红色几何对
  • 如何在 php 和 mongodb 中使用 findAndModify

    我想将 id 加 1 但运行 php 页面时出现问题 错误是 Fatal error Call to undefined method MongoCollection findAndModify in C wamp www 我的代码是
  • 如何在 SpringBoot v3.0.0 中使用嵌入式 MongoDB?

    我正在尝试连接嵌入式 mongodb 并使用 MongoDbSpringIntegrationTest 对其进行测试 问题是相同的代码在 2 7 7 中适用于 spring boot 但在 3 0 0 中不适用于 spring boot 问
  • MongoDB 全文搜索分数“分数是什么意思?”

    我正在为我的学校开发一个 MongoDB 项目 我有一个句子集合 我进行正常的文本搜索以查找集合中最相似的句子 这是基于评分的 我运行这个查询 db sentences find text search any text score met
  • 如何通过引用文档查询嵌入文档?

    我正在使用 Doctrine ODM 但在通过引用文档查询嵌入文档时遇到问题 考虑以下文件
  • 猫鼬递归填充

    我已经搜索了一段时间 但没有找到任何好的答案 我有n deep我存储在数据库中并且想要填充的树所有的父母所以最后我得到了完整的树 node parent parent parent 到目前为止 我已达到 2 级 正如我提到的 我需要达到 2
  • 如何在 C# 中为 mongodb 文档的条目使用不同的名称?

    我正在尝试对以下文档进行 CRUD 操作MongoDB and C 我希望在 C 中使用具有长有意义的属性名称的固定结构化域实体 但由于每个属性的名称将保存在每个文档的 MongoDB 中 所以这不是一个好主意 这是因为属性名称将被冗余地保
  • 从mongoDB和Nodejs获取数据:toArray不是函数错误[重复]

    这个问题在这里已经有答案了 我有以下代码 var user User find limit 1 skip 10 toArray 但我收到错误消息toArray不是一个函数 但如果我执行以下操作 我将获得所有记录 User find func

随机推荐