前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~
主页: oliver尹的主页
格言: 跌倒了爬起来就好~
来个关注吧,点个赞吧,谢谢
《MongoDB》Mongo Shell中的基本操作-文档查询
- 一、简介
- 二、内容概述
- 三、文档读取
- 3.1 db.collection.find()
- 读取全部文档
- 读取匹配文档
- 比较操作符查询
- $eq 操作符
- $ne操作符
- $gt操作符
- $gte操作符
- $lt操作符
- $lt操作符
- $in 操作符
- $nin 操作符
- 逻辑操作符查询
- $not 操作符
- $and 操作符
- $or 操作符
- $nor 操作符
- 字段操作符
- $exists 操作符
- $type 操作符
- 数组操作符
- $all 操作符
- $elemMatch 操作符
- $all 操作符和 $elemMatch 操作符联合使用
- 运算操作符
- $regex 正则操作符
- 四、小结
一、简介
本篇记录备份的是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(),但查询时候的操作符非常复杂,需要经常使用与回顾~