1.数组末尾加入一个元素

push的作用就是,如果指定的键已经存在,它会向已有的数组末尾加入一个元素,要是没有就会创建一个新的数组

db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{$push:{“relationships”:{“fname”:”xiong”,”lname”:”lan”}}})
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),"age" : 23,"favorite" : {"1" : "reading","2" : "swimming","3" : "listening music"},"fname" : "jeff","height" : 166,"lname" : "jiang","relationships" : [{"fname" : "deng","lname" : "pan"},{"fname" : "qiang","lname" : "he"},{"fname" : "dongren","lname" : "zeng"},{"fname" : "xiong","lname" : "lan"}]

2.数组末尾删除一个元素

对数组进行“减”操作,能达到对数组“减”目的的修改器有两个,pop和pull

db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{$pop:{“relationships”:1}})
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),"age" : 23,"favorite" : {"1" : "reading","2" : "swimming","3" : "listening music"},"fname" : "jeff","height" : 166,"lname" : "jiang","relationships" : [{"fname" : "deng","lname" : "pan"},{"fname" : "qiang","lname" : "he"},{"fname" : "dongren","lname" : "zeng"},]

3.数组开头删除一个元素

从数组的开头删除该怎么办呢。很简单,把上面的“1”改成“-1”,它将逆向操作

db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{$pop:{“relationships”:-1}})
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),"age" : 23,"favorite" : {"1" : "reading","2" : "swimming","3" : "listening music"},"fname" : "jeff","height" : 166,"lname" : "jiang","relationships" : [{"fname" : "qiang","lname" : "he"},{"fname" : "dongren","lname" : "zeng"}]

4.数组中间删除一个元素

想删除数组中间的呢。这时,$pull派上用场
pull可以将数组中间的数据删除。这里还有一点要注意,pull会将所有匹配到的数据都删除

db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{$pull:{“relationships”:{“fname”:”dongren”,”lname”:”zeng”}}})
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),"age" : 23,"favorite" : {"1" : "reading","2" : "swimming","3" : "listening music"},"fname" : "jeff","height" : 166,"lname" : "jiang","relationships" : [{"fname" : "qiang","lname" : "he"},{"fname" : "xiong","lname" : "lan"}]

5.过滤元素

1.我们再往数组里插入一相同的数据,它是能正常插入到数组的。而在实际生产环境中,我们都不想看到这样的结果,
那么,这里又出现了两个可以用的修改器:ne和addToSet。$ne主要拿来判断,若数组里面有这个值,则不插入;没有才插入

db.user.update({“relationships.fname”:{ne:"xiong"}},{set:{“fname”:”xiong”,”lname”:”lan”}})
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),"age" : 23,"favorite" : {"1" : "reading","2" : "swimming","3" : "listening music"},"fname" : "jeff","height" : 166,"lname" : "jiang","relationships" : [{"fname" : "qiang","lname" : "he"},{"fname" : "xiong","lname" : "lan"},]

2.ddToSet比ne更好用,它可以自己判断数据是否存在,而且它和each结合使用,还能同时在数组中插入多个数据,这是ne没办法办到的

db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{addToSet:{"relationships":{each:[{“fname”:”xiong”,”lname”:”lan”},
{“fname”:”dongren”,”lname”:”zeng”}]}}})
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),"age" : 23,"favorite" : {"1" : "reading","2" : "swimming","3" : "listening music"},"fname" : "jeff","height" : 166,"lname" : "jiang","relationships" : [{"fname" : "qiang","lname" : "he"},{"fname" : "xiong","lname" : "lan"},{"fname" : "xiong","lname" : "lan"},{"fname" : "dongren","lname" : "zeng"}]

在修改语句中,我们想同时插入{“fname”:”xiong”,”lname”:”lan”},

{“fname”:”dongren”,”lname”:”zeng”}两个数据,但在原数组中,
{“fname”:”xiong”,”lname”:”lan”}这个数据已经存在,所以它只插入了后面那条。达到了我们想要的目的。所以,我个人更喜欢使用$addToSet

6.对其中的一部分进行操作

有时候数组有多个值,而我们只想对其中的一部分进行操作。如果我们把整个文档都抄下来,那太麻烦也太愚蠢了。好在mongodb给我们提供了两种简便方法:通过位置或者操作符“$”。下面我们来分别看看这两种方法怎么使用。首先是通过数组位置来操作。数组都是以0开头的,可以将下标直接作为键来选择元素。例如,我们想给数组的第一个数据加上年龄键值对,我们可以这么操作:

 db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{$set:{“relationships.0.age”:22}})
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),"age" : 23,"favorite" : {"1" : "reading","2" : "swimming","3" : "listening music"},"fname" : "jeff","height" : 166,"lname" : "jiang","relationships" : [{"age" : 22,"fname" : "qiang","lname" : "he"},{"fname" : "deng","lname" : "pan"},{"fname" : "xiong","lname" : "lan"}]

可是很多情况下,不预先查询文档我们就不知道要修改数组的元素的下标。这时定位操作符“$”就很好用了。它就是用来定位查询文档已匹配的元素,并进行更新。我们来看看它怎么用:

db.user.update({“relationships.fname”:”xiong”},{set:{"relationships..age”:22}})
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),"age" : 23,"favorite" : {"1" : "reading","2" : "swimming","3" : "listening music"},"fname" : "jeff","height" : 166,"lname" : "jiang","relationships" : [{"age" : 22,"fname" : "qiang","lname" : "he"},{"age" : 22,"fname" : "deng","lname" : "pan"},{"age" : 22,"fname" : "xiong","lname" : "lan"}]

7 mongodb中$的作用

定义

定位符$的确定数组中一个要被更新的元素的位置,而不用具体指定该元素在数组中的位置。
用法

1.更新数组中的值
1)语法格式

{"<array>.$": value}

2)示例
创建集合students有以下文档:

db.students.insert([{ "_id" : 1, "grades" : [ 85, 80, 80 ] },{ "_id" : 2, "grades" : [ 88, 90, 92 ] },{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
])

将grades数组中第一个值为80更新为82,如果你不知道第一个值的具体位置,就可以像下面这样写:

db.students.updateOne({ _id: 1, grades: 80 },{ $set: { "grades.$" : 82 } }
)

定位符$像一个占位符,匹配第一个符合查询条件的值的位置。
2.更新数组中的文档
定位符为更新那些包含嵌入文档的数组提供了方便。要取得嵌入文档中的字段属性值,在后面使用点符号。如一下语法格式描述

1)语法格式

db.collection.update({ <query selector> },{ <update operator>: { "array.$.field" : value } }
)

2)举例
假设students集合中grades数组包含以下嵌入的文档:

{_id: 4,grades: [{ grade: 80, mean: 75, std: 8 },{ grade: 85, mean: 90, std: 5 },{ grade: 85, mean: 85, std: 8 }]
}

使用$定位符去更新grades数组中文档中字段std的值,被更新的文档是第一个匹配grade值为85的文档。如下:

db.students.updateOne({ _id: 4, "grades.grade": 85 },{ $set: { "grades.$.std" : 6 } }
)

更新后的结果为:

{"_id" : 4,"grades" : [{ "grade" : 80, "mean" : 75, "std" : 8 },{ "grade" : 85, "mean" : 90, "std" : 6 },{ "grade" : 85, "mean" : 85, "std" : 8 }]
}

《MongoDB》 数组操作相关推荐

  1. MongoDb数组操作 - unwind解包、group分组统计、sort排序

    MongoDB统计文档(Document)的数组(Array)中的各个元素出现的次数 一,问题描述 [使用 unwind 操作符 "解包" Document 里面的Array中的每 ...

  2. mongoDB的shell数组操作器

    http://www.2cto.com/database/201304/205024.html mongoDB数组操作器 $push会向数组末尾加入一个元素,如果数组不存在,则会创建这个数组. 增加评 ...

  3. MongoDB 聚合操作

    MongoDB 聚合操作 在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多 ...

  4. MongoDB数据库操作---mongoose操作

    Mongoose认知概念 Mongoose是MongoDB的一个对象模型工具,其可以在一部环境下执行.同时它也是针对MongoDB操作的一个队形模型库,封装了MongoDB对文档的一些增删改查等常用方 ...

  5. mongodb基础操作之聚合操作、索引优化

    mongodb基础操作之聚合操作.索引优化 更好的阅读体验 https://www.wolai.com/wrMtYWKdkzKYjoWM1i64qu 目录 聚合操作 聚合管道操作 Map-Reduce ...

  6. mongodb netcore 操作封装_mongodb 的基本函数语法封装

    //这个模块里面封装了所有对数据库的常用操作 var MongoClient = require('mongodb').MongoClient; var config = require(" ...

  7. MongoDB数组修改器更新数据

    MongoDB数组修改器更新数据 这里,我们将了解一下数组修改器.数组,是我们经常看到和使用到的且非常有用的数据结构:它不仅可以通过索进行引用,还可以作为集合来使用.数组修改器,顾名思义,它是用来修改 ...

  8. MongoDB常用操作

    数据库常用命令 1.Help查看命令提示 help db.help(); db.yourColl.help(); db.youColl.find().help(); rs.help(); 2.切换/创 ...

  9. MongoDB数组查询

    文章目录 MongoDB数组查询 数组匹配 查询数组元素 多条件数组元素查询 1. 复合过滤条件查询数组元素 2. 查询满足多个条件的数组元素 3. 按数组索引位置查询元素 4. 按数组长度查询数组 ...

  10. Scrapy框架之MongoDB聚合操作

    目录 MongoDB聚合操作 聚合操作的基本语法 常用的聚合操作 管道命令之$group 按照某个字段进行分组 详解 计算集合中某个字段的平均值 常用表达式 管道命令之$match 示例 管道命令之$ ...

最新文章

  1. Java基础学习_01 概述及环境配置
  2. 前端一HTML:七:css初步认识
  3. C语言32个关键字与C++62个关键字详解
  4. python爬虫自学笔记分析解密_python爬虫学习笔记——1 各种文本分析工具简介之汇总...
  5. 微信小程序 列表的分页实现(最新的最简易的实现方式+思路,附代码)
  6. php 租房子(练习题)
  7. BLURtooth 漏洞导致攻击者覆写蓝牙认证密钥
  8. 负载均衡服务器会话管理
  9. PHP带头大哥的百宝囊!
  10. 概率论与环境数理统计 20210222
  11. 下载c语言软件在哪里,下载c语言编程软件-c语言编程软件去哪里下?c语言编程软件去哪 – 手机爱问...
  12. js drag拖动事件
  13. html5魔塔样板快速上手,《梦幻模拟战》魔塔攻略|先人一步,快速上手梦战自走棋指南...
  14. 190428多线进程编程
  15. pmp中ram和raci的区别_PMP复习三部曲2020
  16. java 线程耗尽_关于线程耗尽导致请求超时系统假死
  17. 教你如何阻止 Google Update 自动升级|Google Chrome
  18. DialogFragment 顶部弹出 设置距离顶部的距离
  19. MATLAB代码:基于二阶锥优化及OLTC档位选择的配电网优化调度
  20. 将数字格式设置为文本格式,并使其出现左上角绿色小三角

热门文章

  1. revit 二次开发 模型线读取
  2. 实验c语言程序数据类型,C语言编程实验.doc
  3. 爱码物联|汽车制造行业,汽车零部件质量溯源解决方案
  4. CentOS 7 腾讯云服务器 Linux无图形化界面静默安装oracle数据库.
  5. 手机网络抓包 转载记录http://blog.csdn.net/skylin19840101/article/details/43485911
  6. Solaris 11 创建IPMP
  7. 学计算机发展方向,2021女生学计算机专业好吗 有什么发展方向
  8. 腾讯降低对京东持股:将由17%降至2.3%,不再为第一大股东
  9. MonkeyEye电影售票系统--活动图
  10. 安卓市场 android2.1.1,iLike安卓数据恢复专业版