Mongodb在UPDATE操作中使用$pull操作

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第68篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关注威赞。谢谢。

本文基于Mongodb的官方文档,介绍使用$pull, 按照指定条件删除数组中的元素。

定义

在UPDATE中使用$pull操作符,删除数组中的指定元素或删除符合条件的数组元素。

语法

在UPDATE操作中使用$pull操作符时,按照下面的语法。

复制代码
{$pull: {<field1>: <value|condition>, <field2>: <value|condition>, ...}}

删除嵌入文档或数组当中的数组元素时,需要使用点操作符。

行为

  • 自mongodb5.0开始,UPDATE操作按照字段名称的字典顺序更新字段。当字段中包含数字时,按照数字顺序依次更新字段。当然,对一个文档的多个字段操作,是原子性的。
  • 当在嵌入文档数组类型的数组指定一个删除条件时,$pull操作符的删除条件类似于集合中的文档查询条件一样查询出数组中的每一个文档元素。
  • 当指定删除的值是数组时,指定的数组必须严格等于删除字段中数组元素,包括数组元素的顺序。
  • 当指定删除的值是文档时,要求文档中的字段和即将删除元素文档中的字段和值相同,字段顺序可以不一致。
  • mongodb 5.0版本以后,向$pull传入空表达式({ })时,mongodb不再抛出错误。空表达式不会修改字段值 ,也不会在oplog中,添加新的操作记录。

应用

删除数组当中与指定值相等的元素

创建stores集合

复制代码
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"

复制代码
db.stores.updateMany({},{$pull:{fruits:{$in: ["apples", "oranges"]}, vegetables: "carrots"}})

查询数据更新后的结果

删除数组中符合查询条件的元素

创建集合profile,其中votes是数组类型字段

复制代码
db.profile.insertOne({_id: 1, votes:[3,5,6,7,7,8]})

构建数据更新语句,删除votes字段中大于等于6的数据。

复制代码
db.profile.updateOne({_id: 1}, {$pull: {votes: {$gte:  6}}})

查询操作结果

使用bulkWrite()方法完成数组元素删除操作

构建一个bulkWrite操作过程,完成下面几个步骤

  1. 向集合中插入数据,其中字段votes是数组字段

  2. 更新插入的数据,删除大于等于6的元素

  3. 更新插入的数据,删除小于等于3的元素

    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()操作结果

复制代码
db.profileBulkWrite.find()

删除数组中的文档

创建survey并插入数据,其中results字段是文档数组类型

复制代码
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的文档。

复制代码
db.survey.updateMany({},{$pull: {results: {score: 8, item: "B"}}})

删除嵌套数组中的文档

创建survey文档并插入数据

复制代码
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数组中删除

复制代码
db.survey.updateMany({},{ $pull: { "results": {
    answers: {
        $elemMatch: {
            q: 2,
            a: { $gte: 8 }
        }
    }
} } })
相关推荐
北京地铁1号线41 分钟前
机器学习笔试选择题:题组2
人工智能·算法·机器学习
heeheeai1 小时前
决策树,随机森林,boost森林算法
算法·决策树·随机森林·kotlin·boost
(●—●)橘子……2 小时前
记力扣2271.毯子覆盖的最多白色砖块数 练习理解
数据结构·笔记·python·学习·算法·leetcode
Tiny番茄2 小时前
排序算法汇总,堆排序,归并排序,冒泡排序,插入排序
算法·排序算法
汽车仪器仪表相关领域3 小时前
南华 NHXJ-02 汽车悬架检验台:技术特性与实操应用指南
人工智能·算法·汽车·安全性测试·稳定性测试·汽车检测·年检站
m0_726965983 小时前
【算法】小点:List.remove
算法
rhy200605203 小时前
SAM的低秩特性
人工智能·算法·机器学习·语言模型
new coder3 小时前
[算法练习]第三天:定长滑动窗口
数据结构·算法
eqwaak04 小时前
科技信息差(9.29)
开发语言·科技·学习·算法
晨非辰4 小时前
《从数组到动态顺序表:数据结构与算法如何优化内存管理?》
c语言·数据结构·经验分享·笔记·其他·算法