我正在学习如何使用MongoEngine和MongoDB,并且我知道如何从这个问题中查询Listfield(EmbeddedDocumentField):
无法查询ListField(EmbeddedDocumentField)
有点恶心。希望有比这更简单的东西。
我知道如何使用链接中的相同示例更改代理的名称:
Agent.objects(name="Brenna Li").update_one(set__name="Brenna Smith")但是,如何更改listfield中嵌入文档中的值呢?例如,我需要什么代码才能将布伦娜·李在C++中的技能级别从6级更改为8级,将她的Java技能级别从4级更改为5级?
发布于 2014-06-30 08:14:13
您可以在mongoengine中使用位置运算符$或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)https://stackoverflow.com/questions/24480213
复制相似问题