【问题标题】:Changing a value in a listfield of embedded documents on MongoEngine更改 MongoEngine 上嵌入文档的列表字段中的值
【发布时间】:2014-06-29 20:56:51
【问题描述】:

我正在学习如何使用 MongoEngine 和 MongoDB,并且我知道如何从这个问题中查询 Listfield(EmbeddedDocumentField):

can't query over ListField(EmbeddedDocumentField)

有点恶心。有点希望有比这更容易的事情。

我知道如何使用链接中的相同示例更改代理的名称:

Agent.objects(name="Brenna Li").update_one(set__name="Brenna Smith")

但是如何更改列表字段中嵌入文档中的值?例如,我需要将 Brenna Li 的 C++ 技能等级从 6 更改为 8 并将她的 Java 技能等级从 4 更改为 5 的代码是什么?

【问题讨论】:

    标签: mongodb mongoengine database


    【解决方案1】:

    您可以在 mongoengine 中使用positional operator $ 或S(因此它可以用作关键字参数)。但是,您一次只能更新一个匹配项。无法在单个查询中同时更新 Java 和 C++ 级别 - 无需替换整个 Skills 列表(这不会很安全)。

    要在两个查询中执行此操作,您可以执行以下操作:

        class Skill(EmbeddedDocument):
           name =  StringField(required = True)
           level = IntField(required = True)
    
        class Agent(Document):
           name = StringField(required = True)
           email = EmailField(required = True, unique = True)
           skills = ListField(EmbeddedDocumentField(Skill))
    
        Agent.drop_collection()
    
        Agent(name="Brenna Li", email="br@example.com",
              skills=[Skill(name="Java", level=2),
                      Skill(name="Surfing", level=6),
                      Skill(name="c++", level=4)]).save()
    
        Agent.objects.filter(name="Brenna Li", skills__name="Java").update(set__name="Brenna Smith", inc__skills__S__level=1)
        Agent.objects.filter(name="Brenna Smith", skills__name="c++").update(inc__skills__S__level=1)
    

    【讨论】:

    • 如果类 Skill 包含另一个属性也是 ListField(EmbeddedDocumentField) 怎么办?我将如何更改嵌套如此深的值?
    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    相关资源
    最近更新 更多