2013-06-04 3 views
5

理由はわかりませんが、$setメソッドを使用して既存のフィールドを更新しようとすると、既存のフィールドは同じコンテキストで置き換えられます。既存のフィールドを削除または上書きしないでメテオコレクションを更新する

たとえば、次のフィールドを持つ既存のコレクションがあるとします。私はこのようなこのコレクションに/更新フィールドを追加しようとするとTicket

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

:コレクションの

名前

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

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

コレクションが更新され、名前フィールドの変更が、配置が削除されますもはやそこにはありません。これは、nameフィールドを削除した場合も同様です。どのようにして同じ構造を何度も何度も渡し続けることなく、流星群を正しく更新するにはどうすればよいですか?

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

すなわち:

答えて

9

ただ、これを行いますあなたはハッシュ全体を置き換えていました。代わりに、ハッシュ内のフィールドを更新することができます。

+0

あなたがこれを投稿したのと同じように、私はこれを見つけました。 http://stackoverflow.com/questions/10290621/how-do-i-partially-update-an-object-in-mongodb-so-the-new-object-will-overlay。数分で受け入れます。ありがとう – Warz

0

変更するフィールドに一意のインデックスがある場合は、フィールド内の残りの情報を破棄することなく、その特定のフィールドを変更することができます。

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

私はMongoDBでかなり新しいですが、これはかなりうまくいっています。

関連する問題