2012-09-12 14 views
9

Mam problemy ze składnią mongoingu.Aktualizowanie listy dokumentów osadzonych w mongoenginie

mam następujące modele ...

class Post(EmbeddedDocument): 
    uid = StringField(required=True) 
    text = StringField(required=True) 
    when = DateTimeField(required=True) 


class Feed(Document): 
    label = StringField(required=True) 
    feed_url = StringField(required=True) 
    posts = ListField(EmbeddedDocumentField(Post)) 

    def my_method(self, post): 
     pass 

... i przekazywane do obiektu Post my_method, chciałbym zaktualizować istniejący post, jeśli istnieje w self.posts z dopasowywanie uid lub push to self.posts, jeśli nie.

Czy jest taka składnia w jednym wywołaniu w mongożynienie?

Odpowiedz

15

Nie z polem listy, w którym nie można utworzyć upsertu na liście w jednym zapytaniu. $addToSet nie będzie działać tak, jak zmieniłeś post, więc nie możesz dopasować. można zakodować okrągłe to ale robi stworzyć sytuacji wyścigu, gdzie istnieje niewielka szansa na błąd, np:

class Post(EmbeddedDocument): 
     uid = StringField(required=True) 
     text = StringField(required=True) 

    class Feed(Document): 
     label = StringField(required=True) 
     feed_url = StringField(required=True) 
     posts = ListField(EmbeddedDocumentField(Post)) 

    Feed.drop_collection() 

    Feed(
     label="label", 
     feed_url="www.feed.com" 
    ).save() 

    post = Post(uid='1', text="hi") 
    updated = Feed.objects(posts__uid=post.uid).update_one(set__posts__S=post) 
    if not updated: 
     Feed.objects.update_one(push__posts=post) 

Najpierw staramy się aktualizować i jeśli ona nie istnieje my pchamy do listy - to to jest miejsce, w którym można uruchomić inny proces i potencjalnie wypchnąć post na listę.

Ryzyko może być dopuszczalne, ale realistycznie, myślę, że zmiana schematu jest lepsza, potencjalnie dzieląc Post na swoją własną kolekcję. Następnie możesz użyć instrukcji update i ustawić cały obiekt. Koszt będzie dodatkową kwerendą, aby uzyskać dane kanału.

+0

Doskonale, dzięki! –

+0

@Ross jak uzyskać tę odpowiedź 'WriteResult ({" nMatched ": 0," nUpserted ": 0," nModified ": 0})' używając 'mongoengine'? Chcę sprawdzić, czy przedmiot został znaleziony. Dzięki –

0
Feed.objects.filter(posts__uid=post.uid).\ 
      update_one(push__posts__S__comments='comment demo') 
Powiązane problemy