MongoDB更新嵌套字段

3
在MongoDB中,如何使用$set来更新嵌套值?
例如,考虑一个名为people的集合,其中包含以下文档:
{
  _id: ObjectId("5a7e395e20a31e44e0e7e284"),
  name: "a",
  address: [{ street: "123", town: "bar" }]
}

如何将嵌入在地址文档中的街道字段从"123"更新为"Main Street"


地址字段一定要是数组吗? - matthPen
@matthPen:是的 - prit kalra
3个回答

3
感谢您,但是我找到了解决方案:
db.collection.updateMany(
        { "address.street": "123" }, 
        { "$set": { "address.$[].street": "Main Street" } }
    )

通过这个查询,您实际上将更新:
  • 第一个具有任何地址.street="123"的文档
  • 为此文档中的所有地址设置街道为“Main street”。 由于您在一个文档和一个地址数组中进行测试,因此似乎可以工作,但是您将在以后遇到一些问题。请查看我的回复。
- matthPen
@matthPen:你能分享一些你遇到的问题吗?如果我想更新所有这样的文档,使用updateMany()怎么样? - prit kalra
将我在答案中提供的文档复制到您的测试数据库中两次。运行您的查询,您会发现第一个文档已更新(updateMany将更新这两个文档),并且所有街道现在都设置为“Main Street”。我认为这不是您期望的行为。 - matthPen
@matthPen:谢谢,但我的意图是更新所有匹配的查询语句。 - prit kalra

1

使用$set$位置运算符一起使用,如下:

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

1

您需要使用$[<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"
        }
    ]
}

https://stackoverflow.com/questions/52613735/morphia-mongodb-update-in-embedded-array-document-fails - prit kalra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接