2013-02-07 9 views
8

Chciałbym dołączyć nowy obiekt EmbeddedDocument ListField do istniejącego dokumentu EmbeddedDocument ListField. Innymi słowy dołączanie nowego dokumentu do listy, która należy do dokumentu na liście.Mongoengine: Jak dołączyć nowy dokument do dokumentu Embedded ListField?

Moja Model A post może zawierać kilka Komentarze każdy komentarz może mieć kilka Lubi:

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) 

mój kod: (nie działa „dołączyć” komenda nie robi istnieje, tylko „set” istnieje)

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

Idealnym rozwiązaniem byłoby coś jak:

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

Komentarze? Propozycje?

Odpowiedz

4

Chcesz $push się nowy element do listy np

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

Jednakże istnieją większe problemy tutaj. Schemat nie jest idealny - coraz większe tablice mogą powodować problemy, ponieważ dokument rośnie, dlatego trzeba go przenieść na nowy dysk (aby zmieścił się w nim), jeśli będzie się ciągle powiększał, co będzie miało wpływ na wydajność.

Aby uzyskać więcej informacji, patrz data modeling docs.

+0

Dziękuję $ push działa! – rat

+1

Witaj, push nie działa, dopóki nie wywołasz reload() z instancją klasy. like product = Product() Product.objects (comments__comment_id = target) .update ( push__comments__S__likes = newLike) product.reload() – Shashank

Powiązane problemy