首页 > 数据库 >MongoDB自学笔记(二)

MongoDB自学笔记(二)

时间:2024-07-15 22:55:19浏览次数:13  
标签:MongoDB db 笔记 qty item inventory 自学 更新 size

一、前言

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

二、文档操作

1、更新文档

基础语法:

解释:
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中的更新文档,也学了部分的操作符。还有剩下的将放在下一篇文章中,希望对你有所帮助。

未完待续

标签:MongoDB,db,笔记,qty,item,inventory,自学,更新,size
From: https://blog.csdn.net/weixin_37624903/article/details/140450931

相关文章

  • LeetCode算法笔记5
    题目描述给你一个字符串 s,找到 s 中最长的 回文子串示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。示例2:输入:s="cbbd"输出:"bb"提示:1<=s.length<=1000s 仅由数字和英文字母组成解法:classSolution:deflongestPalindrome(sel......
  • LeetCode算法笔记2
    题目描述给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0 开头。示例1:输入:l1=[2,4,3],l......
  • 长链剖分笔记
    与轻重链剖分相似.dfs1:高度\(h\)、\(son\);dfs2:\(top\).性质1:到根最多\(O(\sqrtn)\)条轻边.(证明:长链长度最坏情况:1,2,3...)性质2:\(x\)的\(k\)级祖先\(y\)所在的长链长度\(\gek\).(证明:若非,则\(y-x\)是一条更长的链,矛盾.)树上\(k\)级祖先\(O(n\logn)-O(1)\):......
  • 最爽手撕算法个人笔记【第一周-数组】
    27.移除元素给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素。元素的顺序可能发生改变。然后返回nums中与val不同的元素的数量。假设nums中不等于val的元素数量为k,要通过此题,您需要执行以下操作:更改nums数组,使nums的前k个元素包含不......
  • 网络安全相关的一些学习笔记
    网络安全?本文主要为《计算机网络》网络安全章节的学习笔记,也包括部分来自其他博客与网站的段落。1.一些名词解释密码编码学(cryptography):密码体制的设计学密码分析学(cryptanalysis):在未知密钥的情况下从密文推演出明文或密钥的技术上述二者合称密码学(cryptology)无条件安全(理......
  • 设计模式之装饰模式(学习笔记)
    定义装饰模式(DecoratorPattern),又称为包装模式,是一种结构型设计模式。它允许在不改变现有对象结构的情况下,动态地添加新的功能。通过将每个功能封装在单独的装饰器类中,并且这些装饰器类通过引用原始对象来实现功能的组合,从而提供了灵活性和可扩展性的优势。装饰模式避免了通过继......
  • 矩阵优化 DP 以及全局平衡二叉树实现的动态 DP 学习笔记
    矩阵乘法求斐波那契数列的第\(n\)项,其中\(n\le10^{18}\),对数\(m\)取模。写出转移方程,\(f_i=f_{i-1}+f_{i-2}\),直接算是\(O(n)\)的,似乎没什么办法优化。定义大小分别为\(n\timesp\)和\(p\timesm\)的矩阵(分别为\(a\)和\(b\))相乘的结果(矩阵\(c\))是一个大小为\(......
  • IP协议学习笔记
    目录IP地址格式IP分类CIDR和子网掩码介绍NAT+公网、私网地址CIDR与VLSMVLSM子网划分案例练习ReferenceIP的作用类似物理世界中的地址,用于定位机器的位置。只不过物理的地址是文字描述,计算机世界的IP是一串二进制数,并且它是有一定约定和规则的。下面我来学习关于IP的一些历......
  • 论文阅读笔记-LSM-bush
    首先介绍前置工作。缩写缩写全称FPRfalsepositiverate符号符号含义单位NtotaldatasizeblocksFbuffersizeblocksLnumberoflevelsM所有bloomfilter的平均bitsperbitbitspsumofFPRsacrossallBloomfilters$p_i$......
  • Docker学习笔记
    安装不要安装debian自带的docker:sudoaptinstalldocker-compose。debian11和debian12安装的都是v1,没有dockercompose命令。用官网的安装方式:https://docs.docker.com/engine/install/debian/#install-using-the-repository创建imagehttps://docs.docker.com/reference/cl......