2013-02-07 12 views
8

Vorrei aggiungere un nuovo ListField EmbeddedDocument a un documento ListField EmbeddedDocument esistente. In altre parole, aggiunge un nuovo documento all'elenco che appartiene a un documento in elenco.Mongoengine: come aggiungere un nuovo documento a un documento ListField incorporato?

il mio modello: Un post può contenere diversi commenti, ogni commento può avere diverse piace questo:

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) 

My Code: (non funziona 'append' esiste comando dosen't, solo 'set' esiste)

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

La soluzione ideale sarebbe qualcosa di simile:

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

Commenti? Suggerimenti?

risposta

4

Si desidera $push un nuovo elemento alla lista ad esempio:

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

Tuttavia, ci sono problemi più grandi qui. Lo schema non è l'ideale: gli array sempre in crescita potrebbero causare problemi in quanto il documento crescerà e dovrà essere spostato su disco in misura nuova (quindi può adattarsi), se continua a crescere in tal modo che inciderà sulle prestazioni.

Vedere data modeling docs per ulteriori informazioni.

+0

Grazie, $ push funziona! – rat

+1

Ciao, push non funziona finché non chiamo reload() con istanza di classe. like product = Product() Product.objects (comments__comment_id = target) .update ( push__comments__S__likes = newLike) product.reload() – Shashank