MongoDB进阶
MongoDB的进阶用法
一,limit
- limit() : 用于读取指定数量的文档
用法:
db.集合名称.find().limit(number)
例如:
查询find查询到的数据的前两条
db.集合名称.find().limit(2)
二,skip
- skip() : 用于跳过指定数量的文档
用法:
db.集合名称.find().skip(number)
例如:
跳过find查到的数据的前两个,从第3个开始查询:
db.集合名称.find().skip(2)
三,同时使用limit和skip
- db.集合名称.find().skip(5).limit(4)
这个的意思是跳过find()查询到的数据的前5条,从第6条开始查询,查询4条
四,投影
- 在查询到的返回结果中,只选择必要的字段
命令:
db.集合名称.find({},{field : 1,…})
这里说明一下 : - 参数为字段和值,值为1的时候表示显示该字段,为0的时候则不显示
- 特别要注意 :对于_id 列默认是显示的,如果不显示需要明确设置为0
例如:
db.集合名称.find({},{_id : 0, 字段名 : 1, 字段名 :1})
五,排序
- 方法 sort() ,用于对结果集进行排序
db.集合名称.find().sort({字段: 1,…})
说明: - 参数 1为升序排序,参数 -1 为降序排序+
例如:
根据gender降序,在根据age升序
db.集合名称.find().sort({gender : -1 ,age : 1})
六,统计个数
- 方法count()用于统计结果集中文档条数
db.集合名称.find().count()
例如:
统计gender为true的有几个
db.集合名称.find({gender : true}),count()
七,消除重复
- 方法 distinct() 对数据进行去重
db.集合名称.distinct(“去重的字段”, {条件})
例如:
查询所有不重复的hometown
db.集合名称.distinct(“hometown”, {})
聚合操作
一,MongoDB的聚合是什么
- 聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
语法:
db.集合名字.aggregate({管道:{表达式}})
二,常用管道
在MongoDB中,⽂档处理完毕后, 通过管道进⾏下⼀次处理 常用管道命令如下:
- $match : 过滤数据,只输出符合条件的文档
- $group : 将集合中的文档分组,可用于统计结果
- $project : 修改输入文档的结构,如重命名,增加,删除字段,
- $sort : 将输入文档排序后输出
- $limit : 限制聚合管道返回的文档数
- $skip : 跳过指定数量的文档,并返回余下的文档
三,$match的使用
$match用于进行数据的过滤,是在能够在聚合操作中使用的命令,和find区别在于$match 操作可以把结果交给下一个管道处理,而find不行
示例:
-
1,查询age为18的数据
db.集合名称.aggregate({$match : {age:18} }) -
2,查询age大于20的数据
db.集合名称.aggregate({$match : {age : {"$gt" : 20} } })
四,$group的使用
1,按照某个字段进行分组
$group 是所有聚合命令中用的最多的一个命令,用来将集合中的文档分组,可用于统计结果
使用的格式:
{
$group:
{
_id: <expression>, // Group By Expression
<field1>: { <accumulator1> : <expression1> },
...
}
}
说明:
-
_id为必选字段,为被分组字段,可为空或null
-
accumulator为可选字段,其中可携带运算符使用:
2,常用的表达式
- $sum : 计算总和,$sum:1表示以1倍计数
- $avg : 计算平均值
- $min : 获取最小值
- $max: 获取最大值
- $push : 在结果文档中插入值到一个数组中
示例:
db.集合名字.aggregate(
{$group:
{
_id:"$gender",
counter:{$sum:1}
}
}
)
这里要注意:
- db.db_name.aggregate是语法,所有的管道命令都需要写在其中
- _id 表示分组的依据,按照哪个字段进行分组,需要使用$gender表示选择这个字段进行分组
- $sum:1 表示把每条数据作为1进行统计,统计的是该分组下面数据的条数
3,group by null
当我们需要统计整个文档的时候,$group 的另一种用途就是把整个文档分为一组进行统计
示例:
db.集合名字.aggregate(
{$group:
{
_id:null,
counter:{$sum:1}
}
}
)
这里注意:
- _id:null 表示不指定分组的字段,即统计整个文档,此时获取的counter表示整个文档的个数
4,数据透视
正常情况在统计的不同性别的时候,需要知道所有的name,需要逐条观察,如果通过某种方式把所有的name放到一起,那么此时就可以理解为数据透视
示例 :
db.集合名字.aggregate(
{$group:
{
_id:null,
name:{$push:"$name"}
}
}
)
- 使用 $$ROOT 可以将整个文档放入数组中
db.集合名字.aggregate(
{$group:
{
_id:null,
name:{$push:"$$ROOT"}
}
}
)
6,多次聚合
对于如下数据,需要统计出每个country/province下的userid的数量(同一个userid只统计一次)
# 插入数据
db.集合名字.insert([{ "country" : "china", "province" : "sh", "userid" : "a" },
{ "country" : "china", "province" : "sh", "userid" : "b" },
{ "country" : "china", "province" : "sh", "userid" : "a" },
{ "country" : "china", "province" : "sh", "userid" : "c" },
{ "country" : "china", "province" : "bj", "userid" : "da" },
{ "country" : "china", "province" : "bj", "userid" : "fa" }])
db.stu2.aggregate(
{$group:{_id:{country:"$country", province:"$province", userid:"$userid"}}},
{$group:{_id:null, counter:{$sum:1}}}
)
五,$project
1,使用
$project用于修改文档的输入输出结构,例如重命名,增加,删除字段
示例:
# 插入数据
db.集合名字.insert([{ "country" : "china", "province" : "sh", "userid" : "a" },
{ "country" : "china", "province" : "sh", "userid" : "b" },
{ "country" : "china", "province" : "sh", "userid" : "a" },
{ "country" : "china", "province" : "sh", "userid" : "c" },
{ "country" : "china", "province" : "bj", "userid" : "da" },
{ "country" : "china", "province" : "bj", "userid" : "fa" }])
db.集合名字.aggregate(
{$group:{_id:{"国家":'$country', "省份":'$province',userid:'$userid'}}},
{$group:{_id:{"国家":'$_id.国家', "省份":'$_id.省份'},counter:{$sum:1}}},
{$project:{_id:0, "国家":'$_id.国家', "省份":'$_id.省份', "数量":'$counter'}}
)
六,管道命令之$sort
$sort用于将输入的文档排序后输出
使用示例如下:
- 1,查询学生信息,按照年龄升序
db.stu.aggregate({$sort:{age:1}})
- 2,查询男女人数,按照人数降序
db.stu.aggregate(
{$group:{_id:"$gender", counter:{$sum:1}}},
{$sort:{counter:-1}}
)
七,$skip 和 $limit
- $limit 限制返回数据的条数
- $skip 跳过指定的文档数,并返回剩下的文档数
- 同时使用时先使用skip在使用limit
使用示例如下:
- 1.查询2条学生信息
db.stu.aggregate(
{$limit:2}
)
- 2.查询从第3条开始的学生信息
db.stu.aggregate(
{$skip:2}
)
- 3.统计男女生人数,按照人数升序,返回第二条数据
db.stu.aggregate(
{$group:{_id:"$gender",counter:{$sum:1}}},
{$sort:{counter:-1}},
{$skip:1},
{$limit:1}
)