mongodb - 如何修改 mongodb 中嵌套对象数组中的字段名称/键?

标签 mongodb mongo-shell

我有一个 mongodb 集合,其中包含许多这样的对象:

{
 "_id" : "1234", 
 "type" : "automatic", 
 "subtypes" : [
    {
     "_id" : "dfgd",
     "name" : "test subtype", 
     "subjetRequired" : true,
    },
    {
     "_id" : "dfgd",
     "name" : "test subtype2", 
     "subjetRequired" : false,
    }
  ],
 "anotherField" : "some value"
}

如您所见,subtypes 数组中的键之一拼写错误 - “subjetRequired”而不是“subjectRequired”。
我想更正该键名。我怎样才能做到这一点。
首先我要说的是我过去并没有太多地使用 mongodb。
经过大量研究后,我能想到的最好的方法是以下(不起作用):

function remap(doc) {
     subtypes = doc.subtypes;
     var count = 0;
     subtypes.forEach(function(subtype){
         db.taskType.update({"_id": subtype._id}, {
             $set: {"subtypes.subjectRequired" : subtype.subjetRequired},
             $unset: {"subtypes.subjetRequired": 1}
         });
     }
     )
}

db.taskType.find({"subtypes.subjetRequired":{$ne:null}}).forEach(remap);

这不起作用。
我知道循环是正确的,就好像我用打印语句替换其他逻辑一样,我可以访问并打印我想要修改的姓名的字段。
我在这里做错了什么?

最佳答案

您可以使用此更新并避免使用任何代码,它也很稳定,因此您可以放心地多次执行它。

db.collection.updateMany({
  "subtypes.subjetRequired": {
    $exists: true
  }
},
[
  {
    $set: {
      subtypes: {
        $map: {
          input: "$subtypes",
          in: {
            $mergeObjects: [
              "$$this",
              {
                subjectRequired: "$$this.subjetRequired",
                
              }
            ]
          }
        }
      }
    }
  },
  {
    $unset: "subtypes.subjetRequired"
  }
])

Mongo Playground

关于mongodb - 如何修改 mongodb 中嵌套对象数组中的字段名称/键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73473302/

相关文章:

java - 确保嵌套重复实体的索引

node.js - 在Mongoose中填充后查询

mongodb - 如何使用副本集以安静模式进行 mongo shell

bash - 在作为另一个命令一部分的Heredoc中解析变量

mongodb - 如何列出 MongoDB shell 中的所有集合?

mongodb - Grails,多次保存到mongodb会引发乐观锁定异常

javascript - Mongodb 聚合基于过去的日期

c# - MongoClient GetServer/GetDatabase 与 ReplicaSet 的最佳实践

MongoDB:仅获取嵌套数组文档中的特定字段

mongodb - 获取 MongoDB 3.0 中插入的文档