如何使用mongoengine更新嵌入列表中的特定对象?

问题描述 投票:1回答:2

这是我的架构模型

class Address(Document):
       street = StringField()
       city = StringField()
       country = StringField()

    class Users(Document):
       user_name = StringField()
       address = ListField(EmbeddedDocumentField('Address'))

这是我的对象的样子:

{
  user_name: "John",
  address: [
    {
      "street": "broadway",
      "city": "new york",
      "country": "US"
    },
    {
      "street": "weymounth",
      "city": "london",
      "country": "England"
    }
  ]
}

这是我更新地址列表中第二个项目/对象的代码:

new_address = Address(street="bourke", city="melbourne", country="Australia")

User.objects(id="1", address__country="England").update_one(set__address__S=new_address)

但是此更新会更改嵌入列表中的第一个对象而不是第二个对象:

{
  user_name: "John",
  address: [
    {
      "street": "bourke",
      "city": "melbourne",
      "country": "Australia"
    },
    {
      "street": "weymounth",
      "city": "london",
      "country": "England"
    }
  ]
}
python mongodb mongoengine
2个回答
1
投票

尝试使用EmbeddedDocumentListField

from mongoengine import Document, StringField, EmbeddedDocumentListField, EmbeddedDocument
class Address(EmbeddedDocument):
    street = StringField()
    city = StringField()
    country = StringField()

class Users(Document):
    user_name = StringField()
    address = EmbeddedDocumentListField(Address)


addresses = []

addresses.append(Address(street="broadway", city="new york", country="US"))
addresses.append(Address(street="bourke", city="melbourne", country="Australia"))

u = Users(user_name="john", address=addresses)
u.save()

Users.objects(address__country="US").update_one(
    set__address__S=Address(street="some street", city="Paris", country="France")
    )

最终文件:

{ 
    "_id" : ObjectId("59ec3c5219185b2fb4d428fa"), 
    "user_name" : "john", 
    "address" : [
        {
            "street" : "some street", 
            "city" : "Paris", 
            "country" : "France"
        }, 
        {
            "street" : "bourke", 
            "city" : "melbourne", 
            "country" : "Australia"
        }
    ]
}

0
投票

这工作完美,但如果您只需要从列表中更新一个变量,您可以使用标记来完成它:

set__address__S__street = "some street"
© www.soinside.com 2019 - 2024. All rights reserved.