当用find显示文档时是显示全部,当文档足够多,而自己需要的只是满足某些值的文档,如果还用find 就太浪费资源了
MongoDB中条件操作符有:
- (>) 大于 – $gt
- (<) 小于 – $lt
- (>=) 大于等于 – $gte
- (<= ) 小于等于 – $lte
在SQL语句中这些条件操作符对应的是
$gt ———– >
$gte ——— >=
$lt ———— <
$lte ———- <=
$ne ———- != //下面没写但是和上面的用法一样
$eq ———- =
1、大于(>)操作符
db.collection.find({字段:{符号:数值}}) //例如({num:{$gt:300}})代表num>300的
类似于 SQL语句里的
Select * from collection where 字段 符号 数值(例如:num > 300);
先查看数据
> db.col.find()
{ "_id" : ObjectId("5d02074bc31878d18503d810"), "num" : "500" }
{ "_id" : ObjectId("5d0208d6c31878d18503d812"), "num" : "300" }
{ "_id" : ObjectId("5d0208d6c31878d18503d813"), "num" : 200 }
{ "_id" : ObjectId("5d020b4ac31878d18503d814"), "num" : 300 }
{ "_id" : ObjectId("5d020b4ac31878d18503d815"), "num" : 400 }
{ "_id" : ObjectId("5d020b4ac31878d18503d816"), "num" : 500 }
查询
num 字段大于300的文档
> db.col.find({num:{$gt:300}}) //这个就是查询某字段大于300值的文档
{ "_id" : ObjectId("5d020b4ac31878d18503d815"), "num" : 400 }
{ "_id" : ObjectId("5d020b4ac31878d18503d816"), "num" : 500 }
这会发现一个有趣的现象,这解释一下,有两个num字段 为500,但是只显示一个
原因:在创建文档时,有的字段的值用的是字符串的格式,如
db.col.insert({num:"500"})
而如果是数值类型的就可以被操作符筛选,如下:
db.col.insert({num:500})
小于(<),大于等(>=),小于等于(<=) 就不写了,和大于一样,只是符号改变了
2、同时运用大于(>)和小于(<)
在实际数据库查询中肯定有用到有个字段的值符合既大于一个数又小于另一个数的情况
语法:
db.collection.find({字段:{符号:数值,符号:数值}})
//例如({num:{$lt:500,$gt:300}}),num字段的值小于500,大于300
类似于 SQL语句里的
Select * from collection where 字段 符号 数值 AND 字段 符号 数值
(例如:num < 500 AND num > 300);
先准备数据
> db.col.find()
{ "_id" : ObjectId("5d0208d6c31878d18503d813"), "num" : 200 }
{ "_id" : ObjectId("5d020b4ac31878d18503d814"), "num" : 300 }
{ "_id" : ObjectId("5d020b4ac31878d18503d815"), "num" : 400 }
{ "_id" : ObjectId("5d020b4ac31878d18503d816"), "num" : 500 }
开始按条件查询(小于500,大于300)
> db.col.find({num:{$lt:500,$gt:300}})
{ "_id" : ObjectId("5d020b4ac31878d18503d815"), "num" : 400 }
下面关于大于和大于等于等等的就不写了,好上面一样,只是符号改变了
3、模糊查询
在实际的查询中不光是上面对数值按大小范围来查询,还有对于字符串的按模糊匹配查找
- {字段:/某字/} :某字段包含某字
- {字段:/^某字/} : 某字段以某字开头
- {字段:/某字$/} : 某字段以某字结尾
准备数据
> db.col.find()
{ "_id" : ObjectId("5d0346819cd49366b7f099ee"), "title" : "教育" }
{ "_id" : ObjectId("5d0346819cd49366b7f099ef"), "title" : "人民教师" }
{ "_id" : ObjectId("5d0346819cd49366b7f099f0"), "title" : "任教" }
(1)某字段包含某个字的查询
语法
db.col.find({字段:/某字/}) //记住这冒号后不要加双引号,加了就会当成字符串来查
title字段中包含教的文档
> db.col.find({title:/教/}) //这就没加双引号
{ "_id" : ObjectId("5d0346819cd49366b7f099ee"), "title" : "教育" }
{ "_id" : ObjectId("5d0346819cd49366b7f099ef"), "title" : "人民教师" }
{ "_id" : ObjectId("5d0346819cd49366b7f099f0"), "title" : "任教" }
(2)某字段以某字开头的文档
语法
db.col.find({字段:/^某字/}) //记住这冒号后不要加双引号,加了就会当成字符串来查
title字段中以教为开头的文档
> db.col.find({title:/^教/}))
{ "_id" : ObjectId("5d0346819cd49366b7f099ee"), "title" : "教育" }
(3)某字段以某字结尾的文档
语法
db.col.find({字段:/某字$/}) //记住这冒号后不要加双引号,加了就会当成字符串来查
title字段中以教为结尾的文档
> db.col.find({title:/教$/}))
{ "_id" : ObjectId("5d0346819cd49366b7f099f0"), "title" : "任教" }
4、类型操作符
MongoDB对于某个字段的值的类型可以是不同的,对于MySQL这种传统数据库而言,必须先定义这个列的类型才能添加数据,所以MongoDB提供了类型查询,就是此字段必须是什么类型,其他的类型过滤掉
语法
db.col.find({字段名:{$type:"需要的类型"}})
//例如{title:{$type:"string"}},查询title字段必须是string类型的文档
准备数据
> db.col.find()
{ "_id" : ObjectId("5d0346819cd49366b7f099ee"), "title" : "教育" }
{ "_id" : ObjectId("5d0346819cd49366b7f099ef"), "title" : "人民教师" }
{ "_id" : ObjectId("5d0346819cd49366b7f099f0"), "title" : "任教" }
{ "_id" : ObjectId("5d0376e49cd49366b7f099f1"), "title" : 555 }
title字段必须是string类型的
> db.col.find({title:{$type:"string"}})
{ "_id" : ObjectId("5d0346819cd49366b7f099ee"), "title" : "教育" }
{ "_id" : ObjectId("5d0346819cd49366b7f099ef"), "title" : "人民教师" }
{ "_id" : ObjectId("5d0346819cd49366b7f099f0"), "title" : "任教" }
或者
> db.col.find({title:{$type:2}}) //MongoDB中检索集中的数据类型string可以用2代替
{ "_id" : ObjectId("5d0346819cd49366b7f099ee"), "title" : "教育" }
{ "_id" : ObjectId("5d0346819cd49366b7f099ef"), "title" : "人民教师" }
{ "_id" : ObjectId("5d0346819cd49366b7f099f0"), "title" : "任教" }
上面这种方法是MongoDB自己独有的,MySQL等没有
下面是几种常见的检索集中数据类型对应
类型 | 数字 |
---|---|
Double | 1 |
String | 2 |
Object | 3 |
Array | 4 |
Binary data | 5 |
Object id | 7 |
Boolean | 8 |
Date | 9 |
Null | 10 |
还有有一些特殊的,就在这个页面里,有可能因为版本的问题有什么修改,一切以官网为准