2014-06-29 46 views
0
中嵌入文檔的listfield更改值

我正在學習如何使用MongoEngine和MongoDB,我知道如何從這個問題詢問過Listfield(EmbeddedDocumentField):上MongoEngine

can't query over ListField(EmbeddedDocumentField)

排序討厭。那種願望有些比這更容易。

我知道如何使用從鏈接相同的例子來更改代理的名稱:

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

但我怎麼能在一個listfield改變嵌入文檔中的值?例如,我需要什麼代碼將Brenna Li的C++技能水平從6改爲8,她的Java技能水平從4改爲5?

回答

0

您可以在mongoengine中使用positional operator $S(因此它可以用作關鍵字參數)。但是,您一次只能更新一場比賽。無需更換整個Skills列表(這將不會很安全),從而無法在單個查詢中更新Java和C++級別。

做到在兩個查詢,你可以這樣做:

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="[email protected]", 
      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) 
+0

如果什麼職業技能包含這也是一個ListField(EmbeddedDocumentField)另一個屬性?我將如何去改變深層嵌套的價值? – ilikecats