4

我正在尝试使用updatewhiwleupsert提供我自己的_id作为密钥。

事实证明,它仅在我使用时才有效insert,如果upsert: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's docs中看到的内容,这将起作用

4

3 回答 3

9

是的,这是一个鲜为人知的问题。诀窍是使用$set带有 upsert 的修饰符。然后它将组合您的更新和查询部分以形成更新插入的文档。看:

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

应该注意的是,如果没有 $set/$pull/etc., 修饰符,您只是用第二个参数替换文档。

> 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 回答
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 回答