《MongoDB》Mongo Shell中的基本操作-文档查询

前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~
主页: oliver尹的主页
格言: 跌倒了爬起来就好~
来个关注吧,点个赞吧,谢谢

一、简介

本篇记录备份的是Mongo DB的一些基础知识,包括文档长什么样子,Mongo Shell中的CRUD这四种基本操作,什么是CRUD?C(Creadt、创建)R(Read、读取)U(Update、更新)D(Delete、删除),人话就是增、删、改、查等等;
注意,本文中的示例命令都是基于Mongo Shell的,并不是直接运行在类似于node代码中的~

二、内容概述

本文主要分享的内容是如何 通过find()命令进行数据查询,还有很多的操作符包括:比较操作符逻辑操作符字段操作符数组操作符 以及 运算操作符,具体内容如下:
在这里插入图片描述

三、文档读取

3.1 db.collection.find()

find方法是MongoDB中查询的方法,也是整个数据库操作中最常用的方法

db.<collection>.find(<query>,<projection>)

find方法接收两个参数,第一个参数:

  • query:定义了读取操作时筛选文档的条件,也就是过滤条件;
  • projection:定义了对读取结果进行的投射;

什么是投射?简单的说就是可以对结果进行进一步筛选,只返回部分指定的字段,比如一个文档一共有10个字段,但是我们只需要其中的5个,那么通过预设好的投射,可以只返回这5个字段;

读取全部文档

db.<collection>.find()

不添加任何筛选条件即可,返回的是 collection 下的所有数据

读取匹配文档

在第一个参数中 query 添加对应的条件,比如想要查询username是oliver的数据,那么可以这么写

db.<collection>.find({ username : 'oliver' })

查询到的结果是username为oliver的这条数据的全部信息

{
	"_id":new ObjectId("620327ed5a4fe9fe824daa24"),
	"username":"oliver",
	"age":18,
	...
}

当然,这个字段是可以多重的,多重代表着精度更为准确,因为有时候可能会有相同的查询条件的数据,比如username有很多数据都叫oliver,因此,更多的条件代表着更准确的搜索

db.<collection>.find({ username : 'oliver', age : 18 })

比较操作符查询

db.<collection>.find({ <field> : {$<operator>:<value>} })
  • collection: 集合的名称;
  • field: 查询的字段名字,比如上面一小节中的username,age等都属于这个;
  • $operator: 比较操作符;
  • value: 比较值,比如上面一小节中的oliver,18等值;

$eq 操作符

匹配字段值 相等 的文档;

db.<collection>.find({ username : {$eq:'oliver'} })

找到字段username的值 等于 oliver的数据;

$ne操作符

匹配字段值 不相等 的文档;

db.<collection>.find({ username : {$ne:'oliver'} })

找到字段username的值 不等于 oliver的数据;

$gt操作符

匹配字段值 大于 查询值的文档;

db.<collection>.find({ age : {$gt:18 } })

找到字段age的值 大于 18的数据;

$gte操作符

匹配字段值 大于 或者 等于 查询值的文档;

db.<collection>.find({ age : {$gte:18 } })

找到字段age的值 大于 或者 等于 18的数据;

$lt操作符

匹配字段值 小于 查询值的文档;

db.<collection>.find({ age : {$lt:18 } })

找到字段age的值 小于 18的数据;

$lt操作符

匹配字段值 小于 或者 等于 查询值的文档;

db.<collection>.find({ age : {$lt:18 } })

找到字段age的值 小于 或者 等于 18的数据;

$in 操作符

匹配字段值于任意一个查询值相等的文档$in 这个操作符的用法如下:

db.<collection>.find({ <field> : {$in:[<value1>,<value2>...<<valueN>]} })

看个例子

db.<collection>.find({ username : {$in:['oliver','test']} })

这个查询的意思就是,任何一个文档的username只要是oliver或者是test都将被查询出来;

$nin 操作符

匹配字段值与任何查询值都不相等的文档$nin这个操作符的用法如下:

db.<collection>.find({ <field> : {$nin:[<value1>,<value2>...<<valueN>]} })

还是拿上方的那个例子

db.<collection>.find({ username : {$in:['oliver','test']} })

这个查询的意思就是,除了username是oliver或者是test的所有文档都将被查询出来

逻辑操作符查询

模版如下:

db.<collection>.find({ <field> : {
   
   <operator>} })

$not 操作符

匹配筛选条件 不成立 的文档;

db.<collection>.find({ age : {$not:{$lt:18} })

查询所有age字段 不小于 18的数据;

$and 操作符

匹配多个筛选条件 全部成立 的文档;

db.<collection>.find({$and:[{expression1},{expression2},...,{expressionn}] })

具体例子

db.<collection>.find({$and:[{age:{$gt:18}},{name:{$eq:'oliver'}}] })

查询所有age大于18,并且name值是oliver的数据;

$or 操作符

匹配 至少一个筛选条件成立的文档

db.<collection>.find({$or:[{expression1},{expression2},...,{expressionn}] })

具体例子

db.<collection>.find({$or:[{age:{$gt:18}},{name:{$eq:'oliver'}}] })

查询所有age大于18,或者 name值 是oliver的数据;

$nor 操作符

匹配 全部筛选条件都不成立的文档

db.<collection>.find({$nor:[{expression1},{expression2},...,{expressionn}] })

具体例子

db.<collection>.find({$nor:[{age:{$gt:18}},{name:{$eq:'oliver'}}] })

查询所有age不大于18,并且 name值 也不是oliver的数据;

字段操作符

$exists 操作符

匹配 包含查询字段 的文档

db.<collection>.find({
   
   <field>:{$exists:<boolean>}})

具体例子

db.<collection>.find({age:{$exists:true}})

查询所有包含age字段的文档,

$type 操作符

匹配字段类型 符合查询值 的文档

db.<collection>.find({
   
   <field>:{$type:<BSON type>}})
// 或者接受一个数组
db.<collection>.find({
   
   <field>:{$type:[<BSON type1>,<BSON type2>]}})

具体例子

db.<collection>.find({name:{$type:"string"}})

查询所有包含 name 字段,并且 name字段的值是string类型 的文档,如果是数组的话

db.<collection>.find({name:{$type:["string","number"]}})

查询所有包含 name 字段,并且 name字段的值是string类型或者是数字类型 的文档;

数组操作符

数组操作符查询的是字段类型为数组的值

$all 操作符

匹配数组字段中包含所有查询值的文档;

db.<collection>.find({
   
   <field>:{$all:[<value1>,<value2>]}})

具体例子

db.<collection>.find({contact:{$all:["a","b"]}})

查找所有具有字段contact中同时 存在a和b的项

$elemMatch 操作符

匹配数组字段中至少存在一个值满足刷选,这个有点想上面的$or 操作符

db.<collection>.find({
   
   <field>:{$elemMatch:{
   
   <value1>,<value2>}}})

具体例子

db.<collection>.find({contact:{$elemMatch:{$gt:"1000",$lt:"2000"]}})

查找所有具有字段contact中 存在大于1000小于2000的数据

$all 操作符和 $elemMatch 操作符联合使用

查询contact中大于1000小于2000和大于3000小于4000的项

db.<collection>.find({contact:{$all:[
  {$elemMatch:{$gt:"1000",$lt:"2000"]},
  {$elemMatch:{$gt:"3000",$lt:"4000"]},
]}})

运算操作符

$regex 正则操作符

匹配 满足正则表达式的文档

db.<collection>.find({
   
   <field>:{:/pattern/,:'<options>'}})

具体例子

db.<collection>.find({name:{$regex:/oliver/,$options:'i'}})

读取用户姓名包含oliver的文档,不区分大小写

四、小结

本文主要记录了在常规数据库操作中文档查询的一些用法~查询的命令非常简单,都是db.collection.find(),但查询时候的操作符非常复杂,需要经常使用与回顾~

猜你喜欢

转载自blog.csdn.net/zy21131437/article/details/128062682