06、MongoDB -- MongoDB 基本用法(删除文档、查询文档、查询运算符)

目录

  • MongoDB 基本用法
    • 演示前提:
      • 登录单机模式的 mongodb 服务器命令
      • 登录【admin】数据库的 mongodb 客户端命令
      • 登录【test】数据库的 mongodb 客户端命令
    • 删除文档
      • 语法格式
      • 两个变体版本:
      • 1、remove:根据【name】字段删除一条文档
      • 2、deleteOne:根据【name】字段删除一个文档
      • 3、remove:根据【price】删除多条符合条件的文档
      • 4、deleteMany:根据【price】字段删除多条符合条件的文档
    • 查询文档
      • 添加测试数据
      • 语法格式:
      • 1、查询该集合所有的文档
        • 命令
        • 查询结果
      • 2、查询价格大于500的文档
        • 命令
        • 查询结果
      • 3、查询价格大于500的,且【type】为【小说】的文档
        • 命令
        • 命令解释
        • 查询结果
      • 4、查询价格大于900的,或 type为【漫画】的文档
        • 命令
        • 命令解释
        • 查询结果
      • 5、只查询价格大于800的,或 type为【动漫】的name字段、包括_id字段
        • 命令
        • 命令解释
        • 查询结果
      • 6、只查询价格大于800的,或 type为【动漫】的name字段、不包括_id字段
        • 命令
        • 命令解释
        • 查询结果
      • 官方文档查看支持的查询运算符
      • 查询运算符
        • 范围运算符
          • 1、$in:查询 name 为 "家庭教师" 或 "火影忍者 " 的文档
            • 命令:
            • 查询结果:
          • 2、$nin:查询 name 不为 "家庭教师" 或 "火影忍者 " 的文档
            • 命令:
            • 查询结果
        • 逻辑运算符
          • 3、$not:查询 type 不为【小说】的文档
            • 命令:
            • 查询结果:
          • 4、$not:查询 type 不包含【说】的文档(使用正则表达式)
            • 命令:
            • 查询结果:
        • 元素相关运算符
        • 计算相关运算符
        • 全文检索相关运算符
          • 5、查询必须有name字段、且有price字段,且name字段为string类型、price字段的值为int类型
            • 命令:
            • 查询结果:
          • 6、$regex:查询 type 包含 【漫】的文档
            • 命令
            • 查询结果
        • 数组相关的运算符
          • 添加测试数据
          • 7、$all:查询所有 prices 字段中包含 400 和 500 的值
            • 命令:
            • 查询结果
          • 8、$all:查询所有 prices 字段中包含 500 和 600 的值
            • 命令:
            • 查询结果
          • 9、$all:查询所有 prices 字段中包含 500 和 1000 的值
            • 命令:
            • 查询结果
          • 10、$elemMatch:查询所有 prices 中任一元素大于600
            • 命令:
            • 查询结果:
          • 11、$elemMatch:查询所有 prices 中任一元素大于800
            • 命令:
            • 查询结果:
          • 12、$size:查询 prices 数组 包含 5 个元素
            • 命令:
            • 查询结果:
          • 13、$size:查询 prices 数组 包含 3 个元素
            • 命令:
            • 查询结果:

MongoDB 基本用法

演示前提:


登录单机模式的 mongodb 服务器命令

mongod.exe --config "E:\install\mongodb\mongodb-4.2.25\mongod.conf"

在这里插入图片描述


登录【admin】数据库的 mongodb 客户端命令

mongo mongodb://192.168.0.107:27017/admin -u admin -p 123456

在这里插入图片描述


登录【test】数据库的 mongodb 客户端命令

mongo mongodb://192.168.0.107:27017/test -u LJHAAA -p 123456

在这里插入图片描述


往集合中插入文档、更新文档


删除文档


语法格式


db.collection集合名.remove(<filter>,     指定删除条件<justOne>    是否只删除一条,默认为 false
)

db.collection名.remove(<filter>,{justOne: <boolean>,writeConcern: <document>,collation: <document>}
)

两个变体版本:

db.collection.deleteMany() - 删除符合条件的文档,相当于< justOne > 为 false。

db.collection.deleteOne() - 删除符合条件的文档,相当于< justOne > 为 true


1、remove:根据【name】字段删除一条文档

这里有两个文档的【name】都是【火影忍者】,
现在删除 【name】字段为 【火影忍者】的文档,【true】表示指删除一条文档

在这里插入图片描述


删除命令:

db.books.remove({name:"火影忍者""}, true);

{name:“火影忍者”} 这个是删除条件,相当于 sql 的 where 条件
true 表示只删除一条文档


在图形界面执行删除命令:

在这里插入图片描述


删除结果:

成功删除一条【name】为【火影忍者】的数据,还剩一条。

在这里插入图片描述


2、deleteOne:根据【name】字段删除一个文档


再随便添加 3 个文档用来测试

db.books.insert([{"name":"蜡笔小新",type:"动漫"},{"name":"家庭教师",price:158},{"name":"家庭教师",price:1558,type:"动漫"}])

在这里插入图片描述


测试数据:

在这里插入图片描述


删除命令:

deleteOne 的删除命令相当于< justOne > 为 true,不需要在命令中指定< justOne >为 true:

db.books.deleteOne({name:"蜡笔小新"});

在图形界面执行删除命令:

在这里插入图片描述


删除结果:

两条【蜡笔小新】的文档被删除掉一条,只剩下一条。

在这里插入图片描述


3、remove:根据【price】删除多条符合条件的文档

在这里插入图片描述

删除掉 【price】价格大于 【130】 的文档,现在有两个文档符合匹配条件


命令:

db.books.remove({price: {$gt: 130}}, false);

{price: {$gt: 50}} 这个是查询条件,表示匹配 price 的值 大于 50 的文档
false 表示删除多条符合条件的文档


在图形界面执行删除命令:

在这里插入图片描述


成功删除多个符合条件的文档

在这里插入图片描述


4、deleteMany:根据【price】字段删除多条符合条件的文档

用【deleteMany】删除掉【price】大于【50】的符合条件的多个文档
在这里插入图片描述


命令:

db.books.deleteMany({price: {$gt: 50}})

在图形界面执行删除命令:

在这里插入图片描述


执行结果:

删除多个符合条件的文档成功

在这里插入图片描述


上面 writeConcern 与 insert() 方法中的 writeConcern 支持的选项完全相同。

在这里插入图片描述


collation 选项支持如下选项值:

{locale: <string>,caseLevel: <boolean>,caseFirst: <string>,strength: <int>,numericOrdering: <boolean>,alternate: <string>,maxVariable: <string>,backwards: <boolean>
}

remove() 方法 或 deleteOne、deleteMany() 方法最关键的部分就是 filter 的写法。它的写法也是非常丰富。下面查询文档时再来介绍 filter 的写法。



查询文档


添加测试数据

添加一些文档用来测试

db.books.insert([{"name":"家庭教师",price:100,type:"动漫"},{"name":"蜡笔小新",price:200,type:"动漫"},{"name":"火影忍者",price:300,type:"动漫"},{"name":"七龙珠",price:400,type:"动漫"},{"name":"哆啦A梦",price:500,type:"动漫"},{"name":"神奇宝贝",price:600,type:"动漫"},{"name":"一人之下",price:700,type:"漫画"},{"name":"完美世界",price:800,type:"小说"},{"name":"遮天",price:900,type:"小说"},{"name":"圣墟",price:1000,type:"小说"}
])

测试数据:

在这里插入图片描述


语法格式:


db.collection.find( filter ,  projection )

filter 就是查询条件,和前面更新文档、删除文档中的 filter 参数的格式相同。

project 就是一个形如 {字段1: 0, 字段2: 1} 的文档,

其中 0 代表不选出该字段,1 代表选出该字段。

一旦在 find() 方法中定义了 projection,那所有字段默认都不选出
除非使用选项值 1 明确指定要选出该 字段。但_id字段默认选出。

简而言之:指定 projection 参数之后,普通字段默认不选出,但 _id 字段默认选出。


1、查询该集合所有的文档


命令
 db.books.find()

查询结果

在这里插入图片描述


2、查询价格大于500的文档


命令
 db.books.find({price: {$gt: 500}})

查询结果

在这里插入图片描述


3、查询价格大于500的,且【type】为【小说】的文档


命令
 db.books.find({price: {$gt: 500}, type: "小说"})

命令解释

这里有两个查询条件,且是 and 类型的查询条件

db.books.find( {price: {$gt: 500}, type: "小说"}   //一整个花括号表示查询条件文档,查询条件可以看成是一个对象// price: {$gt: 500}     可以看成是查询条件对象的第 1 个属性// type: "小说"          可以看成是查询条件对象的第 2 个属性,两者用逗号隔开)

查询结果

在这里插入图片描述


4、查询价格大于900的,或 type为【漫画】的文档


命令
 db.books.find({$or: [{price: {$gt: 900}}, {type: "漫画"}]})

命令解释
 db.books.find({ $or: [ { price: { $gt: 900 } } , { type: "漫画" } ] }// 表示 or(或)里面有这个   [ { price: { $gt: 900 } } , { type: "漫画" } ] 对象,这个对象必须是一个数组// or 对象的第 1 个属性值:{ price: { $gt: 900 } } // or 对象的第 2 个属性值: { type: "漫画" })

查询结果

在这里插入图片描述


5、只查询价格大于800的,或 type为【动漫】的name字段、包括_id字段


就是查询来的结果只显示 name 和 id 字段


命令
db.books.find({$or: [{price: {$gt: 800}}, {type: "动漫"}]}, {name:1})

命令解释
db.books.find({ $or: [ { price: { $gt: 800 } }, { type: "动漫" } ] },  { name:1 }// { $or: [ { price: { $gt: 800 } }, { type: "动漫" } ] }   查询条件// { name:1 } 表示查询出来的文档,只显示 【name】这个字段// 注意:id 这列是默认显示出来的// 一旦在 find() 方法中定义了 projection,就是这个【 {name:1} 】,// 那所有字段列数据默认都不查询出来,// 除非使用选项值 1 明确指定要选出该字段,但_id字段默认选出// 例如:可通过  {name:1} 指定只查询 name 这列数据
)

相当于 SQL 命令中的:

select id, name from books where price > 800 or type = "动漫" 

查询结果

如图:
一旦在 find() 方法中定义了 projection,就是这个【 {name:1} 】,那所有字段默认都不选出
除非使用选项值 1 明确指定要选出该 字段,但_id字段默认选出。

所以匹配的文档中,只有 name 这个字段被指定查询出来,id是默认查询出来的。

在这里插入图片描述


6、只查询价格大于800的,或 type为【动漫】的name字段、不包括_id字段


就是 查出来的文档只显示 name 字段的值


命令
db.books.find({$or: [{price: {$gt: 800}}, {type: "动漫"}]}, {name:1, _id:0})

命令解释
db.books.find({ $or: [ { price: { $gt: 800 } }, { type: "动漫" } ] },  { name:1 , _id:0 }// { $or: [ { price: { $gt: 800 } }, { type: "动漫" } ] }   查询条件//  name:1  value 值为 1,表示查询出 name 这个列// _id : 0  value 值为 0,表示这个 id 列不显示出来// 注意:id 这列是默认显示出来的,设置 _id:0 ,可显示指定不要让其查询出来。)

相当于 SQL 命令中的:

select  name  from books where price > 800 or type = "动漫" 

查询结果

在这里插入图片描述



官方文档查看支持的查询运算符

官方文档4.4版本

在这里插入图片描述


在这里插入图片描述



官方文档 4.2版本

在这里插入图片描述



官网中,Bson type 的用法

在这里插入图片描述



查询运算符


范围运算符
 $eq   等于$gt   大于$gte  大于等于$in   查询指定值,一个或多个$lt   小于$lte  小于等于$ne   不等于$nin:不在xx范围之内。

1、$in:查询 name 为 “家庭教师” 或 "火影忍者 " 的文档

in 后面应该带数组 --》 $in:[ ]

用 in 查询数组里面的多个指定值元素


命令:
 db.books.find({name: {$in: ["家庭教师", "火影忍者"]}})

查询结果:

用 in 指定查询 name 为 “家庭教师” 和 " 火影忍者" 的文档

在这里插入图片描述


2、$nin:查询 name 不为 “家庭教师” 或 "火影忍者 " 的文档

命令:
db.books.find({name: {$nin: ["家庭教师", "火影忍者"]}})

查询结果

在这里插入图片描述



逻辑运算符
 $and: 该运算符大部分时候可不要,你可直接将多个条件组合成一个filter document。$not:否, 要求其值必须是文档或正则表达式。$nor:异或$or: 或

3、$not:查询 type 不为【小说】的文档

命令:
db.books.find({type: {$not: {$eq: "小说"}}})// 相当于 type 不等于 "小说"

查询结果:

在这里插入图片描述


4、$not:查询 type 不包含【说】的文档(使用正则表达式)

$not 的值需要使用正则表达式


命令:

这个 . 点匹配任意字符

db.books.find({type: {$not: /^.+说/}})

查询结果:

在这里插入图片描述


元素相关运算符
 $exists:要求指定字段存在$type:要求指定字段为指定类型。

计算相关运算符
$expr	允许在查询中使用聚合表达式常用于以下情况:在查询中使用聚合算法,如 sum、avg、$max 等。对字段进行复杂的比较和条件判断,如大于、小于、等于等。$jsonSchema	 要求文档必须符合指定JSON Schema(语义约束)$mod	  Performs a modulo operation on the value of a field and selects documents with a specified result.对字段的值执行取模操作,并选择具有指定结果的文档。$regex	   Selects documents where values match a specified regular expression.选择值与指定正则表达式匹配的文档。

全文检索相关运算符
$text	 执行全文搜索的运算符$where	 允许使用 JavaScript 表达式来执行复杂的查询操作

5、查询必须有name字段、且有price字段,且name字段为string类型、price字段的值为int类型

命令:
db.books.find({$jsonSchema: {required: [ "name", "price" ],properties : {name: { bsonType: "string" },price: { bsonType: "int"} }
}});

【备注】:可以在这里看字段的类型【Tree View】

在这里插入图片描述


查询结果:

在这里插入图片描述


6、$regex:查询 type 包含 【漫】的文档

命令
db.books.find({type: {$regex: /^.*漫.*$/}})// $regex 的值应该是正则表达式// . 点代表任意字符,* 代表任意字符出现 0 到 多次

查询结果

在这里插入图片描述


数组相关的运算符

 $all:要求数组包含 all 所指定的多个元素。

这里的 $all 相当于组合 $and


添加测试数据
db.books.insert({name:"一念永恒", prices:[100, 200, 300, 400,500]})   
db.books.insert({name:"仙逆", prices:[400,500,600,700,800]})   
db.books.insert({name:"光阴之外", prices:[600,700,800,900,1000]})   

在这里插入图片描述


添加的数据
在这里插入图片描述


测试数据区分一下:

在这里插入图片描述


7、$all:查询所有 prices 字段中包含 400 和 500 的值

命令:
db.books.find({prices: {$all: [400, 500]}})

这里的 $all 相当于组合 $and,就是且的意思


查询结果

在这里插入图片描述


8、$all:查询所有 prices 字段中包含 500 和 600 的值

命令:
db.books.find({prices: {$all: [500, 600]}})

查询结果

在这里插入图片描述


9、$all:查询所有 prices 字段中包含 500 和 1000 的值

命令:
db.books.find({prices: {$all: [500, 1000]}})

查询结果

显然,没有哪一个文档的 prices 数组中,同时包含 500 和 1000 的值
在这里插入图片描述


10、$elemMatch:查询所有 prices 中任一元素大于600

命令:
db.books.find({prices: {$elemMatch: {$gt: 600}}})

$elemMatch:要求数组中任意一个元素匹配指定的条件


查询结果:

在这里插入图片描述


11、$elemMatch:查询所有 prices 中任一元素大于800

命令:
db.books.find({prices: {$elemMatch: {$gt: 800}}})  

查询结果:

在这里插入图片描述


12、$size:查询 prices 数组 包含 5 个元素

命令:
db.books.find({prices: {$size: 5}})

$size:要求指定字段为数组、且包含多少个元素


查询结果:

在这里插入图片描述


13、$size:查询 prices 数组 包含 3 个元素

命令:
db.books.find({prices: {$size: 3}})

$size:要求指定字段为数组、且包含多少个元素


查询结果:

在这里插入图片描述


注意:

因为 $size要求指定字段为数组、且包含多少个元素

这个price 不是数组,所以这个查询是查不到数据的

在这里插入图片描述







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

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

相关文章

代码工具APEX的入门使用(未包含安装)

第一次使用APEX是2019年&#xff0c;这个技术成名已久只是我了解的比较晚。请看Oracle ACE的网站&#xff0c;这就是用APEX做的。实际上有一次我看O记的人操作他们的办公流程&#xff0c;都是用APEX做的。 那一年&#xff0c;我用APEX做了一个CMDB的管理系统。那时候还没有流行…

从0搭建Azure DevOps Server

Windows虚拟机搭建DevOps 服务器 背景资源准备安装软件需求流程版本兼容性安装SQL ServerSSMS安装visual StudioAzure DevOps Server测试本地访问端口更改及外界访问 背景 搭建一台Azure DevOps Server 供我们运维项目开发&#xff0c;现在DevOps运维已成为一个主流&#xff0…

C向C++的一个过渡

思维导图 输入输出&#xff0c;以及基础头文件 在c语言中我们常用scanf("%d",&n);和printf("%d\n",n);来输出一些变量和常量&#xff0c;在C中我们可以用cin;和cout;来表示输入输出。 在C语言中输入输出有头文件&#xff0c;在C也有头文件&#xff0…

软件应用,财务收支系统试用版操作教程,佳易王记录账单的软件系统

软件应用&#xff0c;财务收支系统试用版操作教程&#xff0c;佳易王记录账单的软件系统 一、前言 以下软件操作教程以 佳易王账单记账统计管理系统V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 如上图&#xff0c;统计报表包含 收支汇…

在vue前端开发中基于refreshToken和axios拦截器实现token的无感刷新

文章目录 一、需求背景二、token刷新的方案1、根据过期时间重新获取2、定时刷新token接口3、使用了RefreshToken 三、关于RefreshToken四、Refresh Token的优点五、Refresh Token的工作原理六、Refresh Token的使用流程七、Refresh Token的实现步骤1、登录成功后保存AccessToke…

前端CSS常考问题总结

目录 CSS盒模型 CSS选择器的优先级 隐藏元素的方法 px和rem的区别是什么? 重绘重排有什么区别? 重排&#xff08;回流&#xff09;&#xff1a; 重绘&#xff1a; 浏览器的渲染机制: 浏览器如何解析CSS&#xff1f; 元素水平垂直居中的方式 CSS的哪些属性哪些可以…

php开发项目 docx,pptx,excel表格上传阿里云,腾讯云存储后截取第一页生成缩略图

服务器或者存储上传的word,ppt和excel表格需要截取内容展示的时候,就需要管理后台每次上传文件时根据不同文件类型截取图片保存起来,并讲图片的地址保存到数据字段中.网上搜索了很多相关文章遇到的坑不少,经过2天时间终于完成了,将代码和遇到的问题完整记录下来. 本文用的…

【前端寻宝之路】总结学习使用CSS的引入方式

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-BNJBIEvpN0GHNeJ1 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

IDEA自动导入provided的依赖

最近在学习flink 流程序&#xff0c;在写demo程序的时候依赖flink依赖&#xff0c;依赖的包在flink集群里面是自己已经提供了的&#xff0c;在导入的时候配置为provided&#xff0c;像下面这样&#xff0c;以使打包的时候不用打到最终的程序包里面。 <dependency><gro…

Java8,函数式编程应用:

持续更新中&#xff1a; 函数式(Functional)接口 什么是函数式(Functional)接口 只包含一个抽象方法的接口&#xff0c;称为函数式接口。 你可以通过 Lambda 表达式来创建该接口的对象。&#xff08;若 Lambda 表达式 抛出一个受检异常(即&#xff1a;非运行时异常)&#xff0c…

js创建对象方式总结

js创建对象方式总结 字面量方式 使用大括号 {} 创建一个新对象&#xff0c;这是最简单直接的方式。适用于创建单个对象&#xff0c;可以直接在大括号内定义属性和方法。 let person {name: John,age: 30,gender: male};let preson2 {name: John,age: 30,gender: male};cons…

光伏发电预测

XGB、LGB在datacamp(学习网站) data fountain与国家电投系列赛,光伏发电预测 题目:给一组特征,预测瞬时发电量,训练集9000个点,测试集8000个点,特征包含光伏板的属性和外部环境等。 数据字段:ID、光伏电池板背侧温度、光伏电站现场温度、计算得到的平均转换效率、数…

MySQL学习Day25——数据库其他调优策略

一、数据库调优的措施: 1.调优的目标: (1)尽可能节省系统资源&#xff0c;以便系统可以提供更大负荷的服务 (2)合理的结构设计和参数调整&#xff0c;以提高用户操作的响应速度 (3)减少系统的瓶颈&#xff0c;提高MySQL数据库整体的性能; 2.如何定位调优:用户的反馈、日志…

stm32f103zet6笔记1-led工程

1、选择串口调试 2、LED0连接到PB5&#xff0c;PB5设置为推挽输出。PE5同理。 3、生成成对的.c,.h文件。 4、debugger选择j-link。 5、connection选择SWD。 6、编写bsp_led.c,bsp_led.h文件。 7、下载调试&#xff0c;可以看到LED0 500ms闪烁一次&#xff0c;LED1 1000ms闪烁一…

浅谈一个CTF中xss小案例

一、案例代码 二、解释 X-XSS-Protection: 0&#xff1a;关闭XSS防护 之后get传参&#xff0c;替换过滤为空&#xff0c;通过过滤保护输出到img src里面 三、正常去做无法通过 因为这道题出的不严谨所以反引号也是可以绕过的 正常考察我们的点不在这里&#xff0c;正常考察…

Unity之街机捕鱼

目录 &#x1f62a;炮台系统 &#x1f3b6;炮口方向跟随鼠标 &#x1f3b6;切换炮台 &#x1f62a;战斗系统 &#x1f3ae;概述 &#x1f3ae;单例模式 &#x1f3ae;开炮 &#x1f3ae;子弹脚本 &#x1f3ae;渔网脚本 &#x1f3ae;鱼属性信息的脚本 &#x1f6…

怎样获得CNVD原创漏洞证书

1. 前言 因为工作变动&#xff0c;我最近把这一年多的工作挖漏洞的一些工作成果提交到了CNVD漏洞平台&#xff08;https://www.cnvd.org.cn/&#xff09;&#xff0c;获得了多张CNVD原创漏洞证书。本篇博客讲下怎么获得CNVD原创漏洞证书&#xff0c;以供大家参考。 2. CNVD原创…

Canvas笔记03:Canvas元素功能、属性、获取、原理等一文讲透

hello&#xff0c;我是贝格前端工场&#xff0c;最近在学习canvas&#xff0c;分享一些canvas的一些知识点笔记&#xff0c;本期分享canvas元素的知识&#xff0c;欢迎老铁们一同学习&#xff0c;欢迎关注&#xff0c;如有前端项目可以私信贝格。 Canvas元素是HTML5中的一个重…

基于Intel x86的轨道交通/印度地铁自动售检票(AFC)系统

印度孟买地铁3号线 目前&#xff0c;印度孟买3号线正在全面建设中&#xff0c;这条全长33.5公里的线路将是孟买第一条地下地铁线路&#xff0c;设有27个地下车站和1个地面车站&#xff0c;此条线路的成功通车将连接其他地铁线路、单轨铁路、郊区铁路、城际铁路和孟买机场等&am…

解决prettier 报错 Delete `␍`

根目录&#xff08;么有的话&#xff09;新建 .prettierrc.js配置文件 module.exports {tabWidth: 2,semi: true,printWith: 80,singleQuote: true,quoteProps: consistent,htmlWhitespaceSensitivity: strict,vueIndentScriptAndStyle: true,// 主要是最后一行endOfLine:aut…