【问题标题】:MongoDB update Nested fieldMongoDB 更新嵌套字段
【发布时间】:2018-09-27 12:54:38
【问题描述】:

在 MongoDB 中如何使用 $set 更新嵌套值?

例如,考虑具有以下文档的集合 people

{
  _id: ObjectId("5a7e395e20a31e44e0e7e284"),
  name: "a",
  address: [{ street: "123", town: "bar" }]
}

如何将嵌入在address 文档中的street 字段从"123" 更新为"Main Street"

【问题讨论】:

  • 地址字段一定是数组吗?
  • @matthPen:是的

标签: mongodb set


【解决方案1】:

谢谢,但我找到了解决方案:

db.collection.updateMany(
        { "address.street": "123" }, 
        { "$set": { "address.$[].street": "Main Street" } }
    )

【讨论】:

  • 使用此查询,您实际上将更新: - 具有任何 adress.street="123" 的第一个文档 - 将所有地址的街道设置为该文档的“主要街道”。当您使用一个文档和一个数组中的地址进行测试时,它似乎可以工作,但是您会进一步遇到一些问题。查看我的回复
  • @matthPen:您能分享一下您遇到的一些问题吗?如果我想更新所有此类文档,如何在这种情况下使用 updateMany()。
  • 获取我在回答中提供的文档,并将其插入您的测试数据库中两次。运行查询,您将看到第一个文档已更新(updateMany 将更新这两个文档),所有街道现在都设置为“Main Street”。我认为这不是您的预期行为。
  • @matthPen :谢谢,但这就是我更新所有匹配查询语句的目的。
【解决方案2】:

像这样使用$set$ postion operator

db.collection.update(
        { "address.street": "123" }, 
        { "$set": { "address.$.street": "Main Street" } }
    )

【讨论】:

    【解决方案3】:

    您必须使用$[<identifier>](位置更新运算符)来更新匹配的地址(此处为 street="123" 和 town="bar")

    使用这个略有不同的模型(只是添加地址以便更好地理解):

    { 
        "_id" : ObjectId("5a7e395e20a31e44e0e7e284"), 
        "name" : "a", 
        "address" : [
            {
                "street" : "123", 
                "town" : "bar"
            }, 
            {
                "street" : "Lower Street", 
                "town" : "bar"
            }, 
            {
                "street" : "123", 
                "town" : "foo"
            }
        ]
    }
    

    要应用的查询:

    db['01'].update(
      {"_id" : ObjectId("5a7e395e20a31e44e0e7e284")},
      {$set:{"address.$[current].street":"Main Street"}},
      { arrayFilters: [{current:{street:"123","town":"bar"}} ]} 
    )
    

    将导致:

    { 
        "_id" : ObjectId("5a7e395e20a31e44e0e7e284"), 
        "name" : "a", 
        "address" : [
            {
                "street" : "Main Street", 
                "town" : "bar"
            }, 
            {
                "street" : "Lower Street", 
                "town" : "bar"
            }, 
            {
                "street" : "123", 
                "town" : "foo"
            }
        ]
    }
    
    猜你喜欢
    • 2019-09-25
    • 2013-11-05
    • 2012-03-25
    • 2015-06-24
    • 2015-03-05
    • 2020-08-13
    • 1970-01-01
    • 2018-01-14
    • 2014-06-01
    相关资源
    最近更新 更多