0%

mongodb查询

分页

当查询时同时使用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()
}})