关于mongodb驱动中update两个方法的坑
发布于 9 年前 作者 haozxuan 16582 次浏览 最后一次编辑是 8 年前 来自 问答

今天无意中发现一个问题,就是当进行update操作时,如果使用updateMany方法,当主键不存在时即使有upsert参数也不会自动创建,但是updateOne方法就可以,有谁知道原理的吗?还是说是个bug呢? untitled2.png 这个是直接从命令行模式下操作的,可以排除驱动的问题。应该针对所有语言都是这样。

9 回复

更新操作是先查再更,默认是更新第一条查到的数据,想更新所有匹配数据集需要设置{multi:true}

Specify upsert: true for the update specific fields operation. When you specify upsert: true for an update operation that modifies specific fields and no matching documents are found, MongoDB creates a new document using the equality conditions in the update conditions document, and applies the modification as specified in the update document.

沒看出啥問題啊

@dayuoba 额 或许我没有描述清楚,我的目的是想对1、2、3、三条数据进行inc 1操作,前提是这三条都不存在或其中有些不存在的情况,这时候即使加上upsert也仅仅只创建出一条残缺数据,如果是少加muliti,最少也应该是有user字段的,但是结果很奇怪,仅仅有total字段的inc操作 untitled1.png

@jiangzhuo 问题点在于第一条更新出的是一条残缺字段。

追加下,测试用的是mongodb3.0 ,后来测试mongodb2.6也是同样的结果。

@haozxuan 上面@dayuoba 說了 的確就是這樣的 這就是upsert的作用啊

@jiangzhuo 我期望的结果是update多条不存在数据时能够像update一条那样创建出多条完整数据来。或许是我理解偏差了,update多条仅仅是指,比如user为1有多条,他会将这样的数据进行更新?

你要理解先查再更啊,如果你写这样的条件呢update({$gt:0}),你想让mongodb帮你创建多少条不存在的数据?

@dayuoba 对于update的量是由我的$in控制的,并不是后面的修改器。那么我可以理解为当db.test.update({user:{$in:[1]}}, {$inc:{total:1}},{upsert: true, multi:true})这样其实是和db.test.update({user:1}, {$inc:{total:1}},{upsert: true, multi:true})是一样的效果。但是结果却并非如此。

回到顶部