MongoDB中的子文档批量更新

2,226 阅读1分钟

Mongodb 3.6版本的福利好吧!    谢谢观看,转载请标注来源Thanks!

官网:https://docs.mongodb.com/manual/reference/operator/update/positional-all/#up._S_[]

以前好像自己需要些循环遍历之后再进行$set更新

想做一个学习导向社区,做出来现在自己的学校试试吧,也不知道咋样,前端很丑哈哈哈个人最近才有点时间边学边搭建吧

plog.top  

后端使用的Redis 5.2mongodb 4.2 他们都说新版天坑,果然不假,写代码的时间和查文档的时间居然能成 3:1的关系我也是醉了

好了步入正题 

$、$[] 、$[identifier]、{arrayFilters,...}

只匹配子文档中的第一个匹配项,使用它最多只能更新一个子文档。

$[] 能够对多个文档和多个子文档同时操作了,向强大的SQL老哥又迈进一步,

这是在挑衅啊~,然后这个功能还是过于鸡肋,因为我们批量更新子文档是要有条件的

(1)不是全部更新,更新部分字段 或 部分子文档

(2)更新子文档需要过滤条件

1. Operator $  Only match one

2. Operator $[]  & Options arrayFilters



你肯定想问 wtf,这里的  score 是什么玩意儿

答案是过滤之后的下标引用  注意不是下标而是对应项的引用哦, 



比如你的嵌套子文档是 subDocument:[{x:1,y:1},{x:1,y:2},{x:1,y:3},{x:2,y:2}]

你需要更新子文档中 subDocument.x(dont panic!) 这是mongodb自己杜撰的写法,,这个其实应该是 subDocument[index].x == 1 

$[] 匹配数组索引列表就应该是 [0,1,2,3] 这是 subDocument中的数组下标

假如我们加了过滤条件 "y <= 2" 过滤后的结果[0,1]

score in [0,1]是不是很熟悉的 for-in 循环




注意这里使用的下标是 [e] 而不是 ['e.b']arrayFilterse代表每一项子文档的引用,通过e.b对指定项进行过滤


帮助我们对子文档进行查找的工具

一 $elemMatch



二、 $size


三、$all


四、$or



五、$in