2012-12-08 14 views
7
Documents.update(
    {_id: Session.get("current_document_id")}, 
    {$push: {schema: {type: "text", size: size, name: name, label: label}}} 
); 

La query sopra è una raccolta Meteor, e le mappe 'Documents.update' a 'db.documents.update' nella documentazione MongoDB (http: // docs .mongodb.org/manuale/applicazioni/aggiornamento /). Con quella query posso aggiungere un documento schema all'interno del documento principale. Documenti secondari sono memorizzati in un array:Aggiornare un documento secondario contenuto in una matrice contenuta in un documento MongoDB

Document: 
    schema: 
    array: 
     {type: "text", size: 6, name: "first_name", label: "First name"}, 
     {type: "text", size: 6, name: "last_name", label: "Last name"} 

Voglio modificare il nome e la dimensione attributi dei documenti secondari con questa query:

Documents.update(
    {_id: Session.get("current_document_id"), 'schema' : "first_name"}, 
    {$push: {schema: {type: "text", size: 7, name: name, label: "First Name2"}}} 
); 

Ma questa operazione aggiungere un nuovo oggetto direttamente sotto schema e cancella il array:

Document: 
    schema: 
     {type: "text", size: 7, name: "first_name", label: "First Name2"} 

Come posso modificare la query per modificare gli attributi evitando questo problema? Dopo l'interrogazione desidero avere questo documento:

Document: 
    schema: 
    array: 
     {type: "text", size: 7, name: "first_name", label: "First name2"}, 
     {type: "text", size: 6, name: "last_name", label: "Last name"} 
+0

punti dello schema a un array di oggetti – rtacconi

risposta

19

È possibile aggiornare un elemento di matrice esistente utilizzando un'operazione $set che utilizza l'operatore posizionale $ per identificare l'elemento di matrice corrispondente nel selettore simili:

Documents.update(
    {_id: Session.get("current_document_id"), 'schema.name': "first_name"}, 
    {$set: {'schema.$': {type: "text", size: 7, name: name, label: "First Name2"}}} 
); 

Questo sostituirà il abbinato schema elemento con quella inclusa nell'oggetto $set.

Se si desidera aggiornare solo i singoli campi dell'elemento target schema, è possibile utilizzare la notazione a punti. Ad esempio, per aggiornare solo i campi size e name:

Documents.update(
    {_id: Session.get("current_document_id"), 'schema.name': "first_name"}, 
    {$set: {'schema.$.size': 7, 'schema.$.name': name}} 
); 
+0

Grazie funziona, ma sto ottenendo questo errore: https://gist.github.com/4243896. Dopodiché cercherò la causa. L'errore non è molto esplicativo. – rtacconi

+1

@rtacconi Sembra che l'operatore di posizione '$' non sia supportato nel minimongo di meteor: https://github.com/meteor/meteor/issues/153 – JohnnyHK

+0

sì hai ragione :-) – rtacconi

Problemi correlati