2013-02-07 10 views
8

Ich möchte ein neues ListField EmbeddedDocument an ein vorhandenes ListField EmbeddedDocument-Dokument anhängen. Mit anderen Worten: Anfügen eines neuen Dokuments zum Auflisten, das zu einem Dokument in der Liste gehört. Mein ModellMongoengine: Wie füge ich ein neues Dokument an ein Embedded ListField Dokument an?

: A Post mehrere Kommentare enthalten kann, kann jeder Kommentar mehrere Likes haben:

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) 

Mein Code: (es funktioniert nicht 'anhängen' Befehl dosen't vorhanden ist, nur 'set' existiert)

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

Kommentare:

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

Ideale Lösung wäre so etwas wie sein? Vorschläge?

Antwort

4

Sie wollen $push ein neues Element in die Liste zB:

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

Allerdings gibt es größere Probleme hier. Das Schema ist nicht ideal - immer wachsende Arrays können Probleme verursachen, wenn das Dokument wächst, muss es auf dem Datenträger in einem neuen Ausmaß verschoben werden (damit es passt), wenn es ständig wächst und dann die Leistung beeinträchtigt.

Weitere Informationen finden Sie unter data modeling docs.

+0

Vielen Dank $ push funktioniert! – rat

+1

Hallo, Push funktioniert erst, wenn ich reload() mit der Klasseninstanz aufruft. wie product = Product() Product.objects (Kommentare__comment_id = target) .update ( push__comments__S__likes = newLike) product.reload() – Shashank