Mongdb查询 - 比较运算符、逻辑运算符、$type、游标

Mongdb查询 - 比较运算符、逻辑运算符、$type、游标,第1张

目录

一、比较运算符

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表示数字,其他数据类型对应的数字参见下表。

类型对应数字别名说明
Double11double
String2string
Object3object
Array4array
Binary data5binData
Undefined6undefined弃用
ObjectId7objectId
Boolean8bool
Date9date
Null10null
Regular Expression11regex
DBPointer12dbPointer
JavaScript13javascript
Symbol14symbol
JavaScript(with scope)15javascriptWithScope
32-bit integer16int
Timestamp17timestamp
64-bit integer18long
Min key-1minKey
Max key127maxKey

四、文档游标 基本 *** 作

游标这个概念在很多地方都有,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 不保证数据的绝对正确。


 

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/875837.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存