关于mongoose更新数据问题,请大家指教我该如何更新?
发布于 4 个月前 作者 lijianhu1 1198 次浏览 来自 问答

各位大神好,小弟现在有一个更新地址的功能。简单描述下:我在数据库有几个收件地址,但是只有一个是默认地址(字段:isDefault:true),当我修改地址时,假如勾选了“默认地址”,那么我就需要将之前设为默认地址的改为false;
我用的是mongo默认生成的 ‘ id’ 去操作的,因为自己不会动态生成自增的id 我之前的想法是,去查询数据库所有的地址,如果id==我传入的id,则把这条数据的isDefaukt改为true,其他的改为false;但是好像是因为mongo的id问题,并不没卵用,全部改成false了。 后来我们的后端(不会mongodb)说我可以根据id,把需要设为默认地址的改为true,不是这个id的改为false;但是也不行。我觉得应该是我mongose的查询数据出了问题,接触不久请大家指教;附上如下代码 QQ截图20180131165847.png

9 回复

存在$[]占位符吗,具我所知,mongodb好像并不能直接匹配内嵌数组的多个元素啊。

@272092461 我是看文档有这个符号,不知道是不是我理解不到位 https://docs.mongodb.com/manual/reference/operator/update/positional-all/#up.S[]

@lijianhu1 3.6版本新增的啊 学习了 更新false那块是查询不到文档的,$ne: id 这里的作用不是匹配数组里addressList._id不等于id的内嵌文档。 这句话意思是查询该username 且 addressList._id 不存在 id 的文档, 查询结果的单位是文档,而不是内嵌数组的文档

@272092461 非常感谢您的评价,我现在改成QQ截图20180202170446.png,解决了我的困扰,但同时还有一个问题,上面那方法只能修改一条数据,不能修改多条,我把multi也设为true了,还有没有用。请问能解答我的疑惑吗?谢谢

@lijianhu1 你只用$占位符就是只能修改匹配的第一条数据,试试你说的那个$[]呀

@koroshi 试过了,不行。我换成$[]之后一条数据都改不了

@lijianhu1 还不如倒过来想个办法,如果只有一个true,先更新成false,再拿新的更新写进去- - update({userName:"",“addressList.isDefault”:“true”},set:{addressList.$.isDefault:“false”})

@lijianhu1 这样过滤应该可以 User.update({userName: userName}, {$set: {‘addressList.$[item].isDefault’: false}}, {arrayFilters: [{‘item._id’: {$ne: id}}]})

你们后端的意思是,先把addresslist.isdefault都置为false,然后插入一条为true的,相比你的两次更新成操作先后顺序换一下,这样也不用做$ne的那个过滤了

回到顶部