2013-06-04 16 views
5

Non so perché, ma se provo ad aggiornare un campo esistente utilizzando il metodo $set, tutti i campi esistenti vengono sostituiti nello stesso contesto.Aggiornamento raccolta meteorologica senza rimozione o sovrascrittura dei campi esistenti

Ad esempio. Supponiamo che abbia una collezione esistente con i seguenti campi.

Nome della collezione: Ticket

{profile: {name: "Test", placement: 1}, requestor: _id} 

Quando si tenta di aggiungere campi/aggiornamento a questa raccolta in questo modo:

var ticket = Meteor.tickets.findOne({_id: ticketID}); 

if(ticket){ 
    Meteor.users.update(ticket, { 
         $set: profile: {name: "Test2", new_fields: "value"} 
        }); 
} 

La raccolta viene aggiornato e il nome cambia campo, ma il posizionamento viene rimosso e non ci sono più. Questo è anche vero se rimuovo il campo name. Come aggiorniamo correttamente una raccolta di meteore senza dover continuare a passare la stessa struttura più e più volte?

risposta

9

solo fare questo:

$set: {"profile.name": "Test2", "profile.new_fields": "value"} 

Vale a dire Stavi sostituendo l'intero hash. Invece puoi aggiornare i campi all'interno dell'hash.

+0

Proprio come stavi postando questo, ho trovato questo. http://stackoverflow.com/questions/10290621/how-do-i-partially-update-an-object-in-mongodb-so-the-new-object-will-overlay. Accetterà in pochi minuti. Grazie – Warz

0

se il campo che si desidera modificare ha un indice univoco, è possibile modificare quel campo specifico in base a ciò che si desidera senza distruggere le informazioni rimanenti nel campo.

db.artists.find() 

{"_id":ObjectId("1"),"name":"A1","media_id":["m1","m2" ]} 

{"_id":ObjectId("2"),"name":"A2","media_id":["m2","m3"]} 

{"_id":ObjectId("3"),"name":"A3","media_id":["m3","m1","m2"]} 

db.artists.ensureIndex({"name":1}) 

db.artists.update(
    {name:"A1"}, 
    {$set: { name:"A4"}}, 
    { upsert: true } 
    ) 

b.artists.find() 

{"_id":ObjectId("1"),"name":"A4","media_id":["m1","m2" ]} 

{"_id":ObjectId("2"),"name":"A2","media_id":["m2","m3"]} 

{"_id":ObjectId("3"),"name":"A3","media_id":["m3","m1","m2"]} 

Sono un po 'nuovo in MongoDB, ma per me ha funzionato molto bene.

Problemi correlati