如何改变嵌套场的数据类型蒙戈文件?如何改变嵌套场的数据类型蒙戈文件?(How to change d

2019-05-12 03:37发布

我蒙戈结构如下,

"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);
  }
})

任意一个帮助如何改变字符串可以漂浮在嵌套蒙戈文件

Answer 1:

您在此做了正确的方式,但你不包括数组元素中的查询部分匹配.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)
             }
         }
      );
  }
})

所以,你需要为了配合阵列中的东西的位置$运营产生任何影响。

您也可以只使用符号的“指数”值,因为你是无论如何产生,在一个循环:

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
      );
  }
})

刚刚使用匹配索引和方便的是其中存在的数组元素的无唯一标识符。

还要注意的是,无论是“更新插入”或“多”的选项应适用于此处由于这是怎么现有文档流程的性质。


正如“后记”的说明这一点,这也是值得考虑从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排队的操作。 您可以使用该号码,事情是如何分类的播放,但是它会给处于相对安全的方式在速度上显著上升。



Answer 2:

您可以使用下面的查询更新topProcesses.cpuUtilizationPercent的数据类型从字符串浮动

db.db.find({"topProcesses.cpuUtilizationPercent" : {$exists : true}}).
forEach( function(obj)
{ obj.topProcesses.cpuUtilizationPercent = new ISODate(obj.topProcesses.cpuUtilizationPercent);
db.db.save(obj); } );


文章来源: How to change datatype of nested field in Mongo document?