2011-09-02 38 views
7

Mongongengine gömülü belgelerin bir liste alanına denetimleri ve güncelleştirmeleri gerçekleştirmeye yönelik yöntemleri tanımlamaya çalışıyorum. Yapmaya çalıştığım şeyi yapmanın doğru yolu nedir? Kod aşağıda.Gömülü belgelerin bir liste alanını Mongongengine'de güncellemenin doğru yolu nedir?

class Comment(EmbeddedDocument): 
    created = DateTimeField() 
    text = StringField() 

class Post(Document): 
    comments = ListField(EmbeddedDocumentField(Comment)) 

    def check_comment(self, comment): 
     for existing_comment in self.comments: 
      if comment.created == existing_comment.created and 
       comment.text == existing_comment.text: 
       return True 
     return False 

    def add_or_replace_comment(self, comment): 
     for existing_comment in self.comments: 
      if comment.created == existing_comment.created: 
       # how do I replace? 

     # how do I add? 

Böyle bir şey hakkında gitmek için doğru yol bu mu?

cevap

1

Mevcut yorumun dizinini bulmanız gerekiyor.

Ardından (i endeksidir) yeni yorum ile eski yorumunu üzerine yazabilirsiniz mesela:

post.comments[i] = new_comment 

sonra sadece bir post.save() yapmak ve mongoengine bir $set operasyonuna o dönüştürecektir.

Post.objects(pk=post.pk).update(set__comments__i=comment) 
2

Gömülü belgelerin listesi yerine bir EmbeddedDocumentListField kullanabilirsiniz:

Alternatif olarak, sadece $set örneğin yazabiliriz. veya güncelleştirme oluşturmak bazı handy methodsgibi filtreye erişmek Böylece:

class Comment(EmbeddedDocument): 
    created = DateTimeField() 
    text = StringField() 

class Post(Document): 
    comments = EmbeddedDocumentListField(Comment) 

    ... 

    def add_or_replace_comment(self, comment): 
     existing = self.comments.filter(created=comment.created) 
     if existing.count() == 0: 
      self.comments.create(comment) 
     else: 
      existing.update(comment) 

comment anahtar değerinin bir sözlük olmalıdır kadar

+1

not güncelleme anahtar kelime bağımsız değişken (kod test edilmedi) present.update paketini açtığınız çiftler (** comment) –

İlgili konular