2013-02-07 21 views
8

Varolan bir ListField EmbeddedDocument belgesine yeni bir ListField EmbeddedDocument eklemek istiyorum. Başka bir deyişle listedeki bir belgeye ait listeye yeni bir belge eklemek.Mongoengine: Gömülü bir ListField belgesine yeni bir belge nasıl eklenir?

Benim Modeli: (Bu komut dosen't sadece 'set' var 'ekleme' çalışmıyor var):

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

class Comment(EmbeddedDocument): 
    comment = StringField() 
    comment_id = ObjectIdField() 
    likes = ListField(EmbeddedDocumentField(Like)) 

class Like(EmbeddedDocument): 
    user = ReferenceField(User) 
    date = DateTimeField(default=datetime.utcnow,required=True) 

Benim Kodu: Mesaj birkaç Yorumlar içerebilir, her comment birkaç Beğeniler olabilir

def appendNewLike(): 
    user = {..} 
    target = ObjectId(commentId) 
    newLike = Like(user=user) 
    Product.objects(comments__comment_id=target).comments.likes.append(newLike) 

Yorumlar:

def appendNewLike(): 
    user = {..} 
    target = ObjectId(commentId) 
    newLike = Like(user=user) 
    Product.objects(comments__comment_id=target).update(append_comments__S__likes=newLike) 

ideal çözüm gibi bir şey olurdu? Öneriler?

Product.objects(comments__comment_id=target).update(
       push__comments__S__likes=newLike) 

Ancak buradaki asıl sorunları vardır:

cevap

4

Sen $push liste ör bir yeni öğe istiyorum. Şema ideal değildir - sürekli büyüyen diziler, belgenin büyüdükçe sorunlara neden olabilir, çünkü disk sürekli olarak büyüyecek ve bu da performansı artıracaktır.

Daha fazla bilgi için data modeling docs'a bakın.

+0

Teşekkür ederim $ itme işler! – rat

+1

Merhaba, sınıf örneği ile reload() ifadesini çağırıncaya kadar itme çalışmaz. gibi ürün = Ürün() Product.objects (Yorumlar__comment_id = target) .update ( push__comments__S__likes = newLike) product.reload() – Shashank

İlgili konular