目录
一、比较运算符
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:{$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 不保证数据的绝对正确。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)