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 }
        }
    }
} } })
相关推荐
牛客企业服务19 分钟前
2025年AI面试推荐榜单,数字化招聘转型优选
人工智能·python·算法·面试·职场和发展·金融·求职招聘
糖葫芦君1 小时前
Policy Gradient【强化学习的数学原理】
算法
向阳@向远方3 小时前
第二章 简单程序设计
开发语言·c++·算法
github_czy3 小时前
RRF (Reciprocal Rank Fusion) 排序算法详解
算法·排序算法
许愿与你永世安宁4 小时前
力扣343 整数拆分
数据结构·算法·leetcode
爱coding的橙子4 小时前
每日算法刷题Day42 7.5:leetcode前缀和3道题,用时2h
算法·leetcode·职场和发展
满分观察网友z5 小时前
从一次手滑,我洞悉了用户输入的所有可能性(3330. 找到初始输入字符串 I)
算法
YuTaoShao5 小时前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
Heartoxx5 小时前
c语言-指针(数组)练习2
c语言·数据结构·算法
大熊背5 小时前
图像处理专业书籍以及网络资源总结
人工智能·算法·microsoft