MongoDB自学笔记(二)

news2024/11/15 22:23:21

一、前言

接着上一篇文章,在上一篇文章中学习了如何使用数据库、如何创建集合、如何往集合里添加文档,今天我们继续学习一下更新文档,更新文档相对来说比较复杂笔者打算分多次来记录学习过程。

二、文档操作

1、更新文档

基础语法:

  • db.collection.updateOne(filter, update, options)
  • db.collection.updateMany(filter, update, options)
  • db.collection.replaceOne(filter, update, options)
  • db.collection.update(filter,update,options)

解释:
collection:要更新的集合
filter:过滤条件
update:更新后的操作
options:
详细的参数解释:
db.collection.updateOne()

示例1:简单的更新

1、首先我们创建一个名为inventory(库存)的集合,并往里插入一些数据

db.inventory.insertMany( [
   { item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
   { item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
   { item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
] );

结果:
image.png
2、例如我们想要将第一条数据 item=canvas的数据的 数量从100改为80。很自然的我们会认为是这样写的

db.inventory.update({"item":"canvas"},{"qty":80})

我们运行一下看看结果
image.png
image.png

注意坑:很明显这个不是我们想要的结果,这里是把整个文档替换了。
正确的打开姿势:

我们应该使用**“更新操作符”**来更新数据。(更新操作符放在后文讲解),这里我们尝试这将第二条数据的qty更新为100,采用更新操作符后后的语句是这样的。

 db.inventory.update({"item":"journal"},{ $set: { "qty":100}}  )
 或者
 db.inventory.updateOne({"item":"journal"},{ $set: { "qty":100}}  )

运行结果:很明显是符合我们的预期了。
image.png
image.png

示例2:更新嵌套文档

我们知道MongoDB是面向文档的,而文档本质就是JSON,JSON可以有嵌套的形式。以上面的“库存”的集合为例,我们想把第三条数据的 size下的h从27.9 改为30,应该怎么写呢?其实也很简单,只需要用 "."来表示。

db.inventory.update({"item":"mat"},{ $set: { "size.h":30}}  )	
或者
db.inventory.updateOne({"item":"mat"},{ $set: { "size.h":30}}  )	

运行结果:
image.png
image.png
需要注意的是:updateOne这会根据匹配条件查询出第一条满足条件的数据,并且更新。如果要批量更新则需要使用update或者updateMany。

2、更新操作符

上一个小结中我们引入了更新操作符,这个概念,接下来我们继续学习MongoDB中的更新操作符
语法:

{
   <operator1>: { <field1>: <value1>, ... },
   <operator2>: { <field2>: <value2>, ... },
   ...
}

例如:$set: { $set: { “a.2”: , “a.10”: , } }

2.1、$currentDate

(1)含义:将字段的值设置为当前日期,可以使日期或者时间戳
(2)语法:
{ $currentDate: { field1: typeSpecification1, … } }
<typeSpecification> 可以为以下任一项:

  • 布尔值为 true 可将字段值设置为当前日期作为“日期”,或者
  • 显式指定类型的文档 { $type: "timestamp" }{ $type: "date" }。该操作符_区分大小写_,仅接受小写的 "timestamp" 或小写的 "date"

示例:首先我们给库存集合添加一个名为 lastModifyTime的字段,并且给个默认值

db.inventory.updateMany({},{$set:{"lastMoidfyTime":"2024-07-15 12:00:00"}})

image.png
现在我们要将最后更新时间改为当前时间

db.inventory.updateMany({}, {
    $currentDate: {
        "lastMoidfyTime": true
    }
})

运行结果:
image.png
可以看到时间是变了,不过这里要注意的是Mongo默认使用的是UTC+0:00而中国用的是UTC+8:00,所以会有8个小时的时差。
解决方案也不难:
(1)在应用层来+8小时
(2)存时间戳
image.png

2.2.$inc

含义:操作符将字段按指定值递增
语法:{ $inc: { field1: amount1, field2: amount2, … } }
inc只能作用于数字类型的字段上,如果字段不存在则会创建对应的字段,如果作用在null值上会报错。
示例:我们将库存表中notebook的数量+2

db.inventory.updateOne({"_id":ObjectId("66951edbdf24000083007d77")},{ $inc:{"qty":2} })

运行结果:
image.png
image.png
同理如果想要减少那就传入负数 例如

db.inventory.updateOne({"_id":ObjectId("66951edbdf24000083007d77")},{ $inc:{"qty":-2} })
2.3、$mul

含义:将字段的值乘以指定量。
语法:{ KaTeX parse error: Expected 'EOF', got '}' at position 35: …umber1>, ... } }̲ 和上一节中的inc类似,这里不在赘述。

2.4、$min / $max

含义:仅当指定值小于现有字段值时才更新字段。| 仅当指定值大于现有字段值时才更新字段。
语法:{ $min: { field1: value1, … } } | { $max: { field1: value1, … } }
示例:我们想把数量 >80的 全改为80

db.inventory.updateMany({}, {$min:{"qty":80}})

运行结果:
image.png
image.png

3、小结:

今天学习了MongoDB中的更新文档,也学了部分的操作符。还有剩下的将放在下一篇文章中,希望对你有所帮助。

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1928374.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爬虫-requests和Selenium

1、了解requests的功能 1.1 使用post和get发送请求 HTTP中常见发送网络请求的方式有两种&#xff0c;GET和POST。GET是从指定的资源请求数据&#xff0c;POST是向指定的资源提交要被处理的数据。 GET的用法&#xff1a; import requestsr requests.get("https://www.…

面试题010-数据库-MySQL(MySQL+索引)

面试题010-数据库-MySQL(MySQL索引) 目录 面试题010-数据库-MySQL(MySQL索引)题目自测题目答案1. MySQL是什么&#xff1f;有什么优点&#xff1f;2. 什么是SQL注入&#xff1f;如何解决SQL注入&#xff1f;3. MyISAM 和 InnoDB 有什么区别&#xff1f;4. SQL在MySQL数据库中的…

【论文阅读】LLM4GCL: CAN LARGE LANGUAGE MODEL EMPOWER GRAPH CONTRASTIVE LEARNING?

LLM4GCL: CAN LARGE LANGUAGE MODEL EMPOWER GRAPH CONTRASTIVE LEARNING? https://openreview.net/forum?idwxClzZdjqP 图对比学习的重点就是图数据的增强&#xff0c;针对图中节点的表示或者图的结构进行扰动&#xff0c;通过对比学习得到对应的节点表示&#xff0c;以便于…

azure学习在日本IT工作的重要性

在日本数字化转型的浪潮中,微软Azure已经成为众多企业的首选云平台。作为全球第二大云服务提供商,Azure在日本市场的重要性与日俱增。本文将探讨为什么学习Azure对日本IT专业人士至关重要,以及如何通过lalapodo云原生技术的培训课程,快速掌握这一关键技能。 Azure在日本的战略地…

MongoDB教程(五):mongoDB聚合框架

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言MongoDB 聚…

如何申请抖音本地生活服务商?3种方式优劣势分析!

随着多家互联网大厂在本地生活板块的布局力度不断加大&#xff0c;以抖音为代表的头部互联网平台的本地生活服务商成为了创业赛道中的大热门&#xff0c;与抖音本地生活服务商怎么申请等相关的帖子&#xff0c;更是多次登顶创业者社群的话题榜单。 就目前的市场情况来看&#x…

Gitlab CI/CD --- use a sample CI/CD template

0 Preface/Foreword Pipeline, job, stage的关系如下描述&#xff1a; A pipeline is composed of independent jobs that run scripts, grouped into stages. Stages run in sequential order, but jobs within stages run in parallel. 关键信息&#xff1a; pipeline由独…

新款S32K3 MCU可解决汽车软件开发的成本和复杂性问题(器件编号包含S32K322E、S32K322N、S32K328)

全新的S32K3系列专门用于车身电子系统、电池管理和新兴的域控制器&#xff0c;利用涵盖网络安全、功能安全和底层驱动程序的增强型封装持续简化软件开发。 相关产品&#xff1a;S32K328NHT1VPCSR S32K328GHT1MPCSR S32K322NHT0VPASR S32K322EHT0VPBSR S32K322NHT0VPBSR S32K32…

javascript之匿名函数和立即执行函数

函数总体分为具名函数&#xff08;有名字&#xff09;和匿名函数 匿名函数使用方法&#xff1a; let fn function (x, y) { // console.log(函数) console.log(x y) } fn(1, 2) 正常函数&#xff1a; function fun() { console.log(1) } fun() 2.立即执行函数 好处是避免全局…

MySQL运维实战之ProxySQL(9.9)proxysql自身高可用

作者&#xff1a;俊达 proxysql作为一个程序&#xff0c;本身也可能出现故障。部署proxysql的服务器也肯能出现故障。高可用架构的一个基本原则是消除单点。 可以在多个节点上部署proxysql&#xff0c;在proxysql之前再加一层负载均衡&#xff08;如使用LVS或其他技术&#x…

dab-detr: dynamic anchor boxes are better queries for detr【目标检测-方法详细解读】

DAB-DETR: Dynamic Anchor Boxes Are Better Queries for DETR 摘要 在本文中&#xff0c;我们提出了一种新的查询形式&#xff0c;使用动态锚框作为DETR&#xff08;DEtection TRansformer&#xff09;的查询&#xff0c;并提供了对DETR中查询角色的更深入理解。这种新形式直…

《昇思25天学习打卡营第21天|基于 MindSpore 实现 BERT 对话情绪识别》

#学习打卡第21天# 1. BERT 模型 BERT全称是来自变换器的双向编码器表征量&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;&#xff0c;它是Google于2018年末开发并发布的一种新型语言模型&#xff0c;是基于Transformer中的Encoder并加上双向…

Vue中使用mind-map实现在线思维导图

概述 在前面的文章Vue中实现在线画流程图实现中介绍了流程图的在线绘制&#xff0c;在本文&#xff0c;给大家分享一下基于mind-map实现在线的思维导图&#xff0c;并实现&#xff1a;1. 导图导出为图片&#xff1b;2. 打开xmind文件。 实现效果 实现 1. mind-map简介 simp…

文心一言《使用手册》,文心一言怎么用?

一、认识文心一言 &#xff08;一&#xff09;什么是文心一言 文心一言是百度研发的 人工智能大语言模型产品&#xff0c;能够通过上一句话&#xff0c;预测生成下一段话。 任何人都可以通过输入【指令】和文心一言进行对话互动、提出问题或要求&#xff0c;让文心一言高效地…

线程安全(六)AQS 的工作原理

目录 一、AQS 概述1.1 什么是 AQS?1.2 AQS 与 synchronized 区别:1.3 AQS 常见的实现类:二、AQS 的工作原理2.1 state 的用途:2.2 AQS 双向链表:2.3 ConditionObject 双向队列:2.4 总结:画图说明三、AQS 资源同步3.1 AQS 资源同步方式3.2 自定义同步器3.3 常见同步工具类…

简单记录一下在java的Mybatis-plus中用一个SQL语句查询一个嵌套的实体类(实体类中有List,List中还有List)

简单记录一下在java的Mybatis-plus中用一个SQL语句查询一个嵌套的实体类(实体类中有List,List中还有List) 也就是KpCourseInfoClientDetailVO课程详情类中含有List courseChapterList章节列表,然后章节列表中含有List lessonList课时列表,通过一个SQL查询得到结果 KpCourseIn…

对服务器进行基本了解(二)

目录 一. 云服务器数据库 1.查看MYSQL版本 2.查看mysql的运行状态 3.运行mysql 4. 进入mysql的用户 5. 更改用户密码 6. 查找mysql端口号 7. 创建一个数据库 8. 查看用户 9. 查看数据库 10. 显示数据库的表 11. 修改用户的host 12. 对用户赋权 13. 开放指定端…

2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛--学习笔记

#Datawhale #NLP 1.背景介绍&#xff1a; 机器翻译&#xff08;Machine Translation&#xff0c;简称MT&#xff09;是自然语言处理领域的一个重要分支&#xff0c;其目标是将一种语言的文本自动转换为另一种语言的文本。机器翻译的发展可以追溯到20世纪50年代&#xff0c;经历…

Redis的计数功能

Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 许多应用都会使用Redis作为计数的基本工具&#xff0c;可以实现快速计数、查询缓存的功能&#xff0c;同时数据也可以异步处理。例如&#xff1a;博客浏览&#xff0c;用户每查看一次&#xff0c;就会增加一次的访问量&a…

CSS-1_0 CSS和文档流

文章目录 CSS和文档流如何证明这个流的存在呢&#xff1f;流和display番外&#xff1a;inline-block 碎碎念 CSS和文档流 首先什么叫流呢&#xff1f; 通常来说&#xff0c;我们最终看到的网页是HTML文档中定义的各个元素挨个输出的结果&#xff0c;这种一个接一个输出的方式…