2013-06-04 10 views
5

Nie wiem dlaczego, ale jeśli spróbuję zaktualizować istniejące pole przy użyciu metody $set, wszystkie istniejące pola zostaną zastąpione w tym samym kontekście.Zaktualizuj zbiór meteorów bez usuwania lub przesłonięcia istniejących pól

Na przykład. Załóżmy, że mam istniejącą kolekcję z następującymi polami.

Nazwa kolekcji: Ticket

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

Gdy próbuję dodać pola/aktualizacji do tej kolekcji tak:

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

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

Kolekcja zostanie zaktualizowany i nazwisko zmiany pola, ale placement jest usuwany i już tam nie ma. Jest to również prawdą, jeśli usunę pole name. W jaki sposób właściwie aktualizujemy kolekcję meteorów bez ciągłego powtarzania tej samej struktury?

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

Tj:

Odpowiedz

9

Wystarczy to zrobić Wymieniasz cały hasz. Zamiast tego możesz zaktualizować pola w haszach.

+0

Tak samo, jak ty to robiłeś, znalazłem to. http://stackoverflow.com/questions/10290621/how-do-i-partially-update-an-object-in-mongodb-so-the-new-object-will-overlay. Przyjmę za kilka minut. Dzięki – Warz

0

Jeśli pole, które chcesz zmienić ma unikalny indeks, możesz zmodyfikować to pole do żądanego, bez niszczenia pozostałych informacji w polu.

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"]} 

Jestem całkiem nowy w MongoDB, ale zadziałało to całkiem dobrze.

Powiązane problemy