这是我的架构模型
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"
}
]
}
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"
}
]
}
这工作完美,但如果您只需要从列表中更新一个变量,您可以使用标记来完成它:
set__address__S__street = "some street"