2012-09-11 6 views
5

Ho il seguente documento:Aggiornare e/o aggiungere proprietà degli elementi dell'array usando req.body tramite Mongoose?

{ 
    "_id" : ObjectId("503b83dfad79cc8d26000004"), 
    "pdfs" : [ 
     { 
      "title" : "Test document", 
      "pdf_id" : ObjectId("504f6793ce351a595d000004"), 
      "created_at" : ISODate("2012-09-11T16:32:19.276Z") 
     }, 
     { 
      "title" : "Some other doc", 
      "pdf_id" : ObjectId("502bf124b4642341230003f0"), 
      "created_at" : ISODate("2012-09-11T11:34:19.276Z") 
     } 
    ] 
} 

Ora, in una forma in entrata via req.body, ho 2 campi: title e description.

Desidero aggiornare title e inserire description per un pdf_id specificato, come posso farlo?

Così, alla fine, il mio documento sarà ora simile:

{ 
    "_id" : ObjectId("503b83dfad79cc8d26000004"), 
    "pdfs" : [ 
     { 
      "title" : "This is an UPDATED title", 
      "description" : "It has an ALL NEW description", 
      "pdf_id" : ObjectId("504f6793ce351a595d000004"), 
      "created_at" : ISODate("2012-09-11T16:32:19.276Z") 
     }, 
     { 
      "title" : "Some other doc", 
      "pdf_id" : ObjectId("502bf124b4642341230003f0"), 
      "created_at" : ISODate("2012-09-11T11:34:19.276Z") 
     } 
    ] 
} 

Giusto per essere chiari, sono davvero solo cercando la sintassi Mongoose update.

risposta

9

È possibile utilizzare il $ positional operator per fare riferimento all'elemento pdfs gamma compensata della vostra $set:

Model.update(
    { 'pdfs.pdf_id': pdf_id }, 
    { $set: { 
     'pdfs.$.title': title, 
     'pdfs.$.description': description 
    }}, function (err, numAffected) { ... } 
); 
+1

Nel '$ set', c'è qualche modo per assegnare queste proprietà in modo dinamico? L'utente non può fornire alcuni, e preferirei non doverli specificare esplicitamente. – k00k

+0

Certo, dovresti semplicemente creare quell'oggetto '$ set' a livello di codice e poi passare quell'oggetto come secondo parametro alla chiamata' update'. Un po 'come in questa altra domanda: http://stackoverflow.com/questions/12184626/nodejs-mongo-insert-into-subdocument-dynamic-fieldname/12185214#12185214 – JohnnyHK

+0

Cool, grazie. Qualcosa che mi ha fatto inciampare, che potrebbe aiutare gli altri: non mi aggiornerebbe quando ho appena impostato il mio array su '[]'. Ho dovuto creare lo schema per l'array e assicurarmi che _id dell'elemento dell'array che stai cercando di aggiornare sia specificato come 'type: Schema.Types.ObjectId' nello schema. – k00k

Problemi correlati