4

私は自分自身を鍵として提供updateするupsertwhiwleで使用しようとしています。_id

結局のところ、それは私が使用する場合にのみ機能しますinsertupsert:trueアップデートが提供されている場合、新しく挿入されたドキュメントはMongoの自動生成されたものを取得しidます。

下記をご覧ください:

PRIMARY> db.internal.update({_id: "my_id"},{ "value": "xyz"}, {upsert:true})
PRIMARY> db.internal.find()
{ "_id" : ObjectId("50c6cbb21d8b512bc0fe9576"), "value" : "xyz" }
PRIMARY> db.internal.insert({_id: "my_id2", "value": "xyz"})
PRIMARY> db.internal.find()
{ "_id" : ObjectId("50c6cbb21d8b512bc0fe9576"), "value" : "xyz" }
{ "_id" : "my_id2", "value" : "xyz" }

これは機能ですか、それともバグですか?

私がMongoのドキュメントで見たものによると、これは機能するはずです

4

3 に答える 3

9

はい、それはあまり知られていない落とし穴です。秘訣は$set、アップサートで修飾子を使用することです。次に、更新部分とクエリ部分を組み合わせて、アップサートされたドキュメントを形成します。見て:

db.internal.update({_id: "my_id"},{"$set": {"value": "xyz"}}, {upsert:true})
db.internal.find()
// { "_id" : "my_id", "value" : "xyz" }
于 2012-12-11T06:09:51.327 に答える
0

条件部分に加えて、データ部分で_idを再度指定すると、機能することがわかりました。

例えば

PRIMARY> db.internal.update({_id: "my_id3"},{ _id: "my_id3", "value": "xyz"}, {upsert:true})
PRIMARY> db.internal.find()
{ "_id" : ObjectId("50c6cbb21d8b512bc0fe9576"), "value" : "xyz" }
{ "_id" : "my_id2", "value" : "xyz" }
{ "_id" : "my_id3", "value" : "xyz" }

ただし、これは意図されたAPIではないようです-ドキュメントの例でわかるように{ _id:7 }{ upsert:true }

db.bios.update(
   {
     _id: 7,
     name: { first: 'Ken', last: 'Thompson' }
   },
   {
     $set: {
              birth: new Date('Feb 04, 1943'),
              contribs: [ 'UNIX', 'C', 'B', 'UTF-8' ],
              awards: [
                        {
                          award: 'Turing Award',
                          year: 1983,
                          by: 'ACM'
                        },
                        {
                          award: 'IEEE Richard W. Hamming Medal',
                          year: 1990,
                          by: 'IEEE'
                        },
                        {
                          award: 'National Medal of Technology',
                          year: 1998,
                          by: 'United States'
                        },
                        {
                          award: 'Tsutomu Kanai Award',
                          year: 1999,
                          by: 'IEEE'
                        },
                        {
                          award: 'Japan Prize',
                          year: 2011,
                          by: 'The Japan Prize Foundation'
                        }
             ]
           }
   },
   { upsert: true }
)
于 2012-12-11T06:13:00.543 に答える
0

$ set / $ pull / etc。、修飾子がないと、ドキュメントを2番目のパラメーターに置き換えるだけであることに注意してください。

> db.test.update({_id: 'foo'}, {_id: 'foo', value: 'xyz'}, upsert=true)
> db.test.find()
{ "_id" : "foo", "value" : "xyz" }
> db.test.update({_id: 'foo'}, {_id: 'foo', value: 'hello'}, upsert=true)
> db.test.find()
{ "_id" : "foo", "value" : "hello" }
于 2012-12-11T06:28:14.143 に答える