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ます。同じ構造を何度も渡し続けることなく流星コレクションを適切に更新するにはどうすればよいでしょうか?

4

2 に答える 2

9

これを行うだけです:

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

つまり、ハッシュ全体を置き換えていました。代わりに、ハッシュ内のフィールドを更新できます。

于 2013-06-04T23:50:57.787 に答える
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の初心者ですが、これは私にとってはかなりうまくいきました。

于 2015-06-05T19:23:02.793 に答える