本文基于Mongodb的官方文档,介绍使用$pull, 按照指定条件删除数组中的元素。
定义
在UPDATE中使用$pull操作符,删除数组中的指定元素或删除符合条件的数组元素。
语法
在UPDATE操作中使用$pull操作符时,按照下面的语法。
1 | {$pull: {: , : , ...}} |
删除嵌入文档或数组当中的数组元素时,需要使用点操作符。
行为
- 自mongodb5.0开始,UPDATE操作按照字段名称的字典顺序更新字段。当字段中包含数字时,按照数字顺序依次更新字段。当然,对一个文档的多个字段操作,是原子性的。
- 当在嵌入文档数组类型的数组指定一个删除条件时,$pull操作符的删除条件类似于集合中的文档查询条件一样查询出数组中的每一个文档元素。
- 当指定删除的值是数组时,指定的数组必须严格等于删除字段中数组元素,包括数组元素的顺序。
- 当指定删除的值是文档时,要求文档中的字段和即将删除元素文档中的字段和值相同,字段顺序可以不一致。
- mongodb 5.0版本以后,向$pull传入空表达式({ })时,mongodb不再抛出错误。空表达式不会修改字段值 ,也不会在oplog中,添加新的操作记录。
应用
删除数组当中与指定值相等的元素
创建stores集合
1 2 3 4 5 6 7 8 9 10 11 12 | db.stores.insertMany([ { _id: 1 , fruits: [ "apples" , "pears" , "oranges" , "grapes" , "bananas" ], vegetables: [ "carrots" , "celery" , "squash" , "carrots" ] }, { _id: 2 , fruits: [ "plums" , "kiwis" , "oranges" , "bananas" , "apples" ], vegetables: [ "broccoli" , "zucchini" , "carrots" , "onions" ] } ]) |
构建数据更新语句,删除fruits数组中的元素”apples”, “oranges”,删除vegetables数组中的元素”carrots”
1 | db.stores.updateMany({},{$pull:{fruits:{$in: [ "apples" , "oranges" ]}, vegetables: "carrots" }}) |
查询数据更新后的结果
删除数组中符合查询条件的元素
创建集合profile,其中votes是数组类型字段
1 | db.profile.insertOne({_id: 1 , votes:[ 3 , 5 , 6 , 7 , 7 , 8 ]}) |
构建数据更新语句,删除votes字段中大于等于6的数据。
1 | db.profile.updateOne({_id: 1 }, {$pull: {votes: {$gte: 6 }}}) |
查询操作结果
使用bulkWrite()方法完成数组元素删除操作
构建一个bulkWrite操作过程,完成下面几个步骤
- 向集合中插入数据,其中字段votes是数组字段
- 更新插入的数据,删除大于等于6的元素
- 更新插入的数据,删除小于等于3的元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | try { db.profileBulkWrite.bulkWrite([ { insertOne: { "document" : {_id: 1 , votes: [ 3 , 5 , 6 , 7 , 7 , 8 ]} } }, { updateOne: { "filter" : {_id: 1 }, "update" : {$pull: {votes: {$gte: 6 }}} } }, { updateOne: { "filter" : {_id: 1 }, "update" : {$pull: {votes: {$lte: 3 }}} } } ]) } catch (error){ print(error) } |
查询bulkWrite()操作结果
1 | db.profileBulkWrite.find() |
删除数组中的文档
创建survey并插入数据,其中results字段是文档数组类型
1 2 3 4 | db.survey.insertMany([ {_id: 1 , results: [{item: "A" , score: 5 }, {item: "B" , score: 8 }]}, {_id: 2 , results: [{item: "C" , score: 8 }, {item: "B" , score: 4 }]} ]) |
构架数据更新语句,删除results数组中score字段是8,item字段是B的文档。
1 | db.survey.updateMany({},{$pull: {results: {score: 8 , item: "B" }}}) |
删除嵌套数组中的文档
创建survey文档并插入数据
1 2 3 4 5 6 7 8 9 10 | db.survey.insertMany([ {_id: 1 , results: [ {item: "A" , score: 5 , answers:[{q: 1 , a: 4 }, {q: 2 , a: 6 }]}, {item: "B" , score: 8 , answers:[{q: 1 , a: 8 }, {q: 2 , a: 9 }]} ]}, {_id: 2 , results: [ {item: "C" , score: 8 , answers:[{q: 1 , a: 8 }, {q: 2 , a: 7 }]}, {item: "B" , score: 4 , answers:[{q: 1 , a: 0 }, {q: 2 , a: 8 }]} ]} ]) |
构建数据更新语句,将包含q的值为2, a的值大于等于8的文档从results数组中删除
1 2 3 4 5 6 7 8 | db.survey.updateMany({},{ $pull: { "results" : { answers: { $elemMatch: { q: 2 , a: { $gte: 8 } } } } } }) |
到此这篇关于Mongodb在UPDATE操作中使用$pull的操作方法的文章就介绍到这了,更多相关Mongodb使用$pull操作内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!