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