更改MongoEngine上嵌入文档的列表字段中的值

时间:2014-06-29 20:56:52

标签: mongodb mongoengine database

我正在学习如何使用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?

1 个答案:

答案 0 :(得分:0)

您可以在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)