分页
当查询时同时使用sort,skip,limit,无论位置先后,最先执行顺序 sort再skip再limit。
想要读取从 10 条记录后 100 条记录,相当于 sql 中limit (10,100)。
1
| db.getCollection('user').find.skip(10).limit(100)
|
以上实例在集合中跳过前面 10 条返回 100 条数据。
skip 和 limit 结合就能实现分页。
补充说明:
第一个 {} 放 where 条件,为空表示返回集合中所有文档。
第二个 {} 指定那些列显示和不显示 (0表示不显示 1表示显示)。
1
| db.col.find({},{"title":1,_id:0}).limit(2)
|
条件操作符
|操作 |格式 |范例 |RDBMS中的类似语句
|—-|——|—-
|等于 |{<key>:<value>} |db.col.find({“by”:”guagua”}).pretty() |where by = ‘guagua’
|小于 |{<key>:{$lt:<value>}} |db.col.find({“likes”:{$lt:50}}).pretty() |where likes < 50
|小于或等于 |{<key>:{$lte:<value>}} |db.col.find({“likes”:{$lte:50}}).pretty() |where likes <= 50
|大于 |{<key>:{$gt:<value>}} |db.col.find({“likes”:{$gt:50}}).pretty() |where likes > 50
|大于或等于 |{<key>:{$gte:<value>}} |db.col.find({“likes”:{$gte:50}}).pretty() |where likes >= 50
|不等于 |{<key>:{$ne:<value>}} |db.col.find({“likes”:{$ne:50}}).pretty() |where likes != 50
and
1 2
| db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"}).pretty() 以上实例中类似于 WHERE 语句:WHERE by='菜鸟教程' AND title='MongoDB 教程'
|
or
1 2 3 4 5 6 7
| db.col.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty()
|
AND 和 OR 联合使用
1 2 3
| 以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: 'where likes>50 AND (by = '菜鸟教程' OR title = 'MongoDB 教程')'
db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
|
大于等于小于
1 2 3 4 5 6 7 8 9 10
| MongoDB 使用 (<) 和 (>) 查询 - $lt 和 $gt db.col.find({likes : {$lt :200, $gt : 100}})
备注: $gt -------- greater than > $gte --------- gt equal >= $lt -------- less than < $lte --------- lt equal <= $ne ----------- not equal != $eq -------- equal =
|
MongoDB 排序
sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。
1 2
| 以下实例演示了 col 集合中的数据按字段 likes 的降序排列: db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
|
MongoDB中聚合(aggregate)
主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 现在我们通过以上集合计算每个作者所写的文章数,使用aggregate()计算结果如下: > db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}]) { "result" : [ { "_id" : "runoob.com", "num_tutorial" : 2 }, { "_id" : "Neo4j", "num_tutorial" : 1 } ], "ok" : 1 }
|
|表达式 |描述 |实例
|—-|——
|$sum |计算总和。 |db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$sum : “$likes”}}}])
|$avg |计算平均值 |db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$avg : “$likes”}}}])
|$min |获取集合中所有文档对应值得最小值。|db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$min : “$likes”}}}])
|$max |获取集合中所有文档对应值得最大值。|db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$max : “$likes”}}}])
|$push |在结果文档中插入值到一个数组中。|db.mycol.aggregate([{$group : {_id : “$by_user”, url : {$push: “$url”}}}])
|$addToSet |在结果文档中插入值到一个数组中,但不创建副本。| db.mycol.aggregate([{$group : {_id : “$by_user”, url : {$addToSet : “$url”}}}])
|$first |根据资源文档的排序获取第一个文档数据。| db.mycol.aggregate([{$group : {_id : “$by_user”, first_url : {$first : “$url”}}}])
|$last |根据资源文档的排序获取最后一个文档数据 |db.mycol.aggregate([{$group : {_id : “$by_user”, last_url : {$last : “$url”}}}])
管道-聚合框架中常用的几个操作
$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
$limit:用来限制MongoDB聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group:将集合中的文档分组,可用于统计结果。
$sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。
$project
1 2 3 4 5 6 7
| 这样的话结果中就只还有_id,tilte和author三个字段了,默认情况下_id字段是被包含的,填0。。1是显示,0是隐藏 db.getCollection('user').aggregate( { $project : { id : 1 , deleted : 1 , }} );
|
$match实例
$match用于获取id=0,username不等于guagua记录,然后将符合条件的记录送到下一阶段$group管道操作符进行处理。
1 2 3 4
| db.getCollection('user').aggregate( [ { $match : { id : { $eq : 0} , username:{ $ne : 'guagua' } } }, {$group : {_id : "$username", gua : {$sum : '$updated_time'}}} ] );
|
$skip实例
1 2
| db.getCollection('user').aggregate({$skip : 2}) 经过$skip管道操作符处理后,前2个文档被"过滤"掉
|
在后台创建索引:
1
| db.values.ensureIndex({open: 1, close: 1}, {background: true})
|
MongoDB 自动增长
创建 Javascript 函数
db.counters.insert({_id:"gua",sequence_value:0})
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function getNextSequenceValue(sequenceName){ var sequenceDocument = db.counters.findAndModify( { query:{_id: sequenceName }, update: {$inc:{sequence_value:1}}, new:true }); return sequenceDocument.sequence_value; }
db.counters.insert({ "_id":getNextSequenceValue("gua"), "product_name":"Apple iPhone", 'test':'guaguagua'})
|
$type 操作符
| 类型 |
数字 |
备注 |
| Double |
1 |
|
| String |
2 |
|
| Object |
3 |
|
| Array |
4 |
|
| Binary data |
5 |
|
| Undefined |
6 |
已废弃。 |
| Object |
id |
7 |
| Boolean |
8 |
|
| Date |
9 |
|
| Null |
10 |
|
| Regular Expression |
11 |
|
| JavaScript |
13 |
|
| Symbol |
14 |
|
| JavaScript (with scope) |
15 |
|
| 32-bit integer |
16 |
|
| Timestamp |
17 |
|
| 64-bit integer |
18 |
|
| Min key |
255 |
Query with -1. |
| Max key |
127 |
|
1 2
| 如果想获取 "col" 集合中 title 为 String 的数据,你可以使用以下命令: db.col.find({"title" : {$type : 2}})
|
时间戳
1 2 3 4
| db.getCollection('counters').find({gua:{ $gte:new Date(2017,7,01).getTime(), $lte:new Date(2017,7,18).getTime() }})
|