目录
一、比较运算符
Mongo查询条件和SQL查询对照表
比较运算符示例
二、逻辑操作符
逻辑操作符示例
$not用法
$and用法
$eq用法
$or用法
三、$type操作符
四、文档游标
基本操作
游标的执行顺序
limit
skip
sort
count
一、比较运算符
Mongo查询条件和SQL查询对照表
SQL |
MQL |
a<>1 或者 a!=1 |
{ a : {$ne: 1}} |
a>1 |
{ a: {$gt:1}} |
a>=1 |
{ a: {$gte:1}} |
a<1 |
{ a: {$lt:1}} |
a<=1 |
{ a: { $lte:1}} |
in |
{ a: { $in:[ x, y, z]}} |
not in |
{ a: { $nin:[ x, y, z]}} |
a is null |
{ a: { $exists: false }} |
1<a<100 |
{a:{$gt:1,$lt:100}} |
比较运算符示例
参考我的另一篇文章:Mongdb查询 - 常见场景查询语句示例 - 2、条件查询(比较运算符)
二、逻辑操作符
$not : 匹配筛选条件不成立的文档
$and : 匹配多个筛选条件同时满足的文档
$or : 匹配至少一个筛选条件成立的文档
$nor : 匹配多个筛选条件全部不满足的文档
逻辑操作符示例
构造一组数据:
db.members.insertMany([
{
nickName:"曹操",
points:1000
},
{
nickName:"刘备",
points:500
}
]);
$not用法
{ field: { $not : { operator-expression} }}
积分不小于100 的
db.members.find({points: { $not: { $lt: 100}}} );
$not 也会筛选出并不包含查询字段的文档。
$and用法
{ $and : [ condition expression1 , condition expression2 ..... ]}
$eq用法
昵称等于曹操, 积分大于 1000 的文档 :
db.members.find({$and : [ {nickName:{ $eq : "曹操"}}, {points:{ $gt:1000}}]});
当作用在不同的字段上时 可以省略 $and(昵称是曹操,积分大于1000) :
db.members.find({nickName:{ $eq : "曹操"}, points:{ $gt:1000}});
当作用在同一个字段上面时可以简化为(大于等于1000,小于等于2000):
db.members.find({points:{ $gte:1000, $lte:2000}});
$or用法
{ $or :{ condition1, condition2, condition3,... }}
db.members.find(
{$or : [
{nickName:{ $eq : "刘备"}},
{points:{ $gt:1000}}]}
);
===================
db.inventory.find({$or:[{"qty":0},{"status":"A"}]}).pretty();
如果都是等值查询的话, $or 和 $in 结果是一样的
三、$type操作符
菜鸟教程 - $type操作符
$type可以用来根据数据类型查找数据,比如我想要查找x类型为数字的文档,如下:
db.sang_collect.find({x:{$type:1}})
1表示数字,其他数据类型对应的数字参见下表。
类型 |
对应数字 |
别名 |
说明 |
Double1 |
1 |
double |
String |
2 |
string |
Object |
3 |
object |
Array |
4 |
array |
Binary data |
5 |
binData |
Undefined |
6 |
undefined |
弃用 |
ObjectId |
7 |
objectId |
Boolean |
8 |
bool |
Date |
9 |
date |
Null |
10 |
null |
Regular Expression |
11 |
regex |
DBPointer |
12 |
dbPointer |
JavaScript |
13 |
javascript |
Symbol |
14 |
symbol |
JavaScript(with scope) |
15 |
javascriptWithScope |
32-bit integer |
16 |
int |
Timestamp |
17 |
timestamp |
64-bit integer |
18 |
long |
Min key |
-1 |
minKey |
Max key |
127 |
maxKey |
四、文档游标
基本操作
游标这个概念在很多地方都有,Java中JDBC里的ResultSet,Android中的Cursor等等都是,MongoDB中也有类似的概念。当我们调用find方法时,就可以返回一个游标,如下:
var cursor = db.sang_collect.find();
游标中有hasNext()方法,也有next()方法,这两个方法结合可以用来遍历结果,如下:
while(cursor.hasNext()){
print(cursor.next())
}
next()方法可以获取查询到的每一个文档,如下:
{
"_id" : ObjectId("59f299579babb96c21ddc9e8"),
"x" : 0.0,
"y" : 1000.0
}
/* 2 */
{
"_id" : ObjectId("59f299579babb96c21ddc9e9"),
"x" : 1.0,
"y" : 999.0
}
如果我只想获取文档中的某一个字段,可以按如下方式:
while(cursor.hasNext()){
print(cursor.next().y)
}
cursor也实现了JavaScript中的迭代器接口,所以我们也可以直接调用forEach方法来遍历:
cursor.forEach(function(x){
print(x)
})
当我们调用find方法获取cursor时,shell并不会立即查询数据库,而是在真正使用数据时才会去加载,这有点类似于数据库框架中的懒加载,shell在每次查询的时候会获取前100条结果或者前4MB数据(两者之间取最小),然后我们调用hasNext和next时shell就不用再去连接数据库了,直接一条一条的返回查询到的数据,这100条或者4MB数据全部被返回之后,shell才会再次发起请求向MongoDB要数据。
游标的执行顺序
当同时应用 sort, skip, limit 时 ,应用的顺序为 sort, skip, limit。
当同时应用 sort, skip, limit 时 ,应用的顺序为 sort, skip, limit。
limit
>db.COLLECTION_NAME.find().limit(NUMBER)
limit是cursor中的方法,用来限制返回结果的数量。如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。
比如我只想获取查询的前三条结果,方式如下:
var cursor = db.sang_collect.find().limit(3)
skip
>db.COLLECTION_NAME.find().skip(NUMBER).limit(NUMBER)
skip也是cursor中的方法,用来表示跳过的记录数,我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
比如我想获取第2到第5条记录,如下:
var cursor = db.sang_collect.find().skip(2).limit(4)
跳过前两条(0和1)然后获取后面4条数据,skip和limit结合有点类似于MySQL中的limit,可以用来做分页,不过这种分页方式效率过低。
原本limit(1)应该是“PHP 教程”,但是skip(1)跳过了这条,所以打印的是“java 教程”。
sort
sort用来实现排序功能,比如按x排序,如下:
var cursor = db.sang_collect.find().sort({x:-1})
1表示升序,-1表示降序。
count
cursor.count( applySkipLimit)
默认情况下 , 这里的count不会考虑 skip 和 limit的效果,如果希望考虑 limit 和 skip ,需要设置为 true。 分布式环境下,count 不保证数据的绝对正确。