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

标签 python mongodb mongoengine

This is my schema model

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

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

This is what my object look like:

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

This is my code to update the second item/object in address list:

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

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

But this update change the first object in embedded list instead of the second one:

{
  user_name: "John",
  address: [
    {
      "street": "bourke",
      "city": "melbourne",
      "country": "Australia"
    },
    {
      "street": "weymounth",
      "city": "london",
      "country": "England"
    }
  ]
}

最佳答案

尝试使用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"
        }
    ]
}

关于python - 如何使用 mongoengine 更新嵌入列表中的特定对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46870784/

相关文章:

python - 删除 3D 绘图中的轴边距

python - 如何使用 sys.argv 将字符串变量从 shell 脚本传递到 python?

java - 如何在 Spring Boot 2.2.x 中使用 Mongo 审计和 UUID 作为 id?

python - 如何在 mongoengine 中获取 ReferenceField 数据?

python - 将 Twitter Bootstrap 轻松集成到任何 Pyramid 表单框架

python - 奇异矩阵的高效和pythonic检查

python - 如何从头开始循环程序

非常大的数据集的 MongoDB 缩放和内存使用

mongodb - 项目嵌入文档键值,基于 mongoDB 聚合中的条件

python - Mongoengine 0.8.0 破坏了我在模型中的自定义 setter 属性