CNode

关于mongodb驱动中update两个方法的坑

问答
Hhaozxuan发布于11 年前最后回复11 年前9 回复17935 浏览0 收藏

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

查看回复

回复 (9)

D
dayuoba#1·11 年前

更新操作是先查再更,默认是更新第一条查到的数据,想更新所有匹配数据集需要设置{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.

J
jiangzhuo#2·11 年前

沒看出啥問題啊

H
haozxuan#3·11 年前
引用 dayuoba更新操作是先查再更,默认是更新第一条查到的数据,想更新所有匹配数据集需要设置{multi:true} Specify upsert: true for the update specific ...

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

H
haozxuan#4·11 年前
引用 jiangzhuo沒看出啥問題啊

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

H
haozxuan#5·11 年前

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

J
jiangzhuo#6·11 年前
引用 haozxuan@jiangzhuo 问题点在于第一条更新出的是一条残缺字段。

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

H
haozxuan#7·11 年前
引用 jiangzhuo@haozxuan 上面@dayuoba 說了 的確就是這樣的 這就是upsert的作用啊

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

D
dayuoba#8·11 年前

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

H
haozxuan#9·11 年前
引用 dayuoba你要理解先查再更啊,如果你写这样的条件呢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})是一样的效果。但是结果却并非如此。

参与回复
登录后即可参与回复。登录