2012-09-12 14 views
9

gömülü belgelerin bir listesini güncelleme Moongengeng sözdizimi ile mücadele ediyorum. mongoengine

Ben şu modeller ...
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 

... ve geçirilen sonrası nesne my_method için birlikte bir ile self.posts mevcutsa, ben Mevcut bir yayını güncellemek istediğiniz uid'i eşleştirin veya değilse, self.post'lara basın.

mongoengine içinde bir çağrıda bunu sözdizimi var mı? Liste alanıyla

cevap

15

yok tek sorguda bir listeye bir Upsert yapamaz. $addToSet, post değiştirdiğiniz için çalışmaz, böylece eşleşemezsiniz. Bu yuvarlak kod olabilir ama hata için örn küçük bir fırsat penceresi olduğu bir yarış durumu oluşturabilir yapar:

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) 

Öncelikle güncellemeyi deneyin ve onu yoksa listeye itmek - Bu Başka bir işlem için bir fırsat penceresi var ve potansiyel olarak listede post itin.

Risk kabul edilebilir, ancak gerçekçi bir şekilde, şemanınızı değiştirmenin daha iyi olduğunu düşünüyorum, potansiyel olarak Post'u kendi koleksiyonuna ayırın. Sonra bir güncelleme deyimi kullanabilir ve tüm nesneyi ayarlayabilirsiniz. Maliyet, feed verilerini almak için ekstra bir sorgu olacaktır.

+0

Mükemmel, teşekkürler! –

+0

@Ross Bu yanıt nasıl alınır 'WriteResult ({" nMatched ": 0," nUpserted ": 0," nmodified ": 0})' 'ongongengine' kullanarak? Öğenin bulunup bulunmadığını kontrol etmek istiyorum. Teşekkürler –

0
Feed.objects.filter(posts__uid=post.uid).\ 
      update_one(push__posts__S__comments='comment demo') 
İlgili konular