【问题标题】:How to add an extra field in a sub document in MongoDB?如何在 MongoDB 的子文档中添加额外的字段?
【发布时间】:2014-03-23 07:35:19
【问题描述】:

我刚刚开始使用 MongoDB。我有一个这样的文件:

   {

     "_id": "12345" 
     "body": "Here is the body" 
     "comments":[
                {
                  "name": "Person 1"
                  "comm": "My comment"},
                {
                  "name": "Person 2"
                  "comm": "Comment 2"}
             ] 
    "author":"Author 1" 
}

我想把这个文件改成:

   {

    "_id": "12345" 
     "body": "Here is the body" 
     "comments":[
                {
                  "name": "Person 1"
                  "comm": "My comment"
                  "checks_": 1
                 },
                {
                  "name": "Person 2"
                  "comm": "Comment 2"
                  "checks_": 4
                }
             ] 
    "author": "Author 1" 
}

我试过了:

db.coll.update({ "_id":12345},{ "$set":{ "comments" :{ "checks_": 1}}})

这会删除 cmets 中的所有子文档并添加 {checks_:1} 到其中。

我哪里错了?

【问题讨论】:

  • 找不到对我有帮助的解决方案..
  • 如果要更新单个数组子文档,可以执行 db.coll.update({id:12345},{$set:{"cmets.0.checks “:1}})。这将更新数组索引 0 处的文档。
  • 啊,谢谢,成功了!
  • 如果我需要一次性完成所有子数组怎么办?

标签: mongodb mongo-shell


【解决方案1】:

所以你做错的是$set 操作符正在做它应该做的事情,它替换 comments 字段的值你已经指定了。这不是向数组中添加额外的文档。

您需要具体并使用“点符号”来“识别”您要替换的数组元素。因此,要获得结果,您需要 两个 更新:

db.coll.update({ "_id":12345},{ "$set":{ "comments.0.checks_" : 1 }})
db.coll.update({ "_id":12345},{ "$set":{ "comments.1.checks_" : 4 }})

至少在 MongoDB 的下一个版本(截至撰写时)发布之前,您可以在其中执行 bulk updates。现在不会太久了。

【讨论】:

    【解决方案2】:

    更通用的解决方案(适用于 MongoDb 3.6+):

    db.coll.update(
    {},
    {$set: {"comments.$[element].checks_": 1}},
    {multi: false, arrayFilters: [{"element.name": {$eq: "Person 1"}}]}
    )
    

    这会将字段添加到列表中的特定子文档中,匹配条件(名称 = 'Person 1')。

    【讨论】:

      猜你喜欢
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 2020-02-02
      • 1970-01-01
      相关资源
      最近更新 更多