0%

MongoDB聚合查询

制作人,也叫监制,英语producer,工作主要是规划制作进度表,策划安排进度,安排每日每天的制作进度,寻找制作群/制作公司,对外争取出资者,同时必须和执行制作共同作业,以确保企划的每个元件都能按时并正确无误地组合在一块儿。游戏制作人(Game Produce)主要指全面掌握了从研发到运营整个体系知识的游戏项目的总负责人,在其管理下实现游戏研发运营一体化。

一、概念

      MongoDB中聚合(aggregate)通过转化合并由多个文档的数据来生成新的在单个文档里不存在的文档信息,主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果,有点类似SQL语句中的count、sum、max等操作。当然由于其自身存储特点和原理,MongoDB的聚合查询要比一般的SQL语句厉(niu)害(bi)多了。

二、常见

  1. $match:过滤数据,只输出符合条件的文档
  2. $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
  3. $limit:限制聚合管道返回的文档数
  4. $skip:跳过指定数量的文档,并返回余下的文档
  5. $group:将集合中的文档分组,可用于统计结果
  6. $unwind:将数组类型的字段进行拆分
  7. $sort:将输入文档排序后输出
  8. $max$min$avg$sum:获取最大值、最小值、平均值、计算总和
  9. $first$last:根据资源文档的排序获取第一个、最后一个文档数据
  10. $size
  11. $literal
  12. $lookup

三、实战

  1. 数据准备(使用python3)

    • 安装python3,使用homebrew或者安装包
    • 安装pip,它是一个Python包管理工具,提供了对Python包的查找、下载、安装、卸载的功能。
      • Python2.7.9+Python3.4+以上版本都自带pip工具,通过安装包安装的一般都在/usr/local/bin,查看ls /usr/local/bin | grep pip
    • 安装依赖pip3 install pymongo,也可指定版本pip3 install pymongo==2.1.1,或直接升级更新pip3 install --upgrade pymongo
      • 安装比较慢的话可以更换国内镜像,自行GG
    • 初始化数据脚本
    1
    2
    def initData():
    print("hello world") #注意缩进
    • 调用方法initData()

手动初始化几条

1
2
3
4
5
6
7
8
use study();
db.user.insertMany([
{"name":"张三","age":10,"sex":1},
{"name":"李四","age":11,"sex":1},
{"name":"王五","age":12,"sex":2},
{"name":"马六","age":11,"sex":2},
{"name":"封七","age":13,"sex":2}
]);
  1. 开始查询
  • $match/$group/$project,查询年龄10岁且性别为1的人数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
db.user.aggregate([
{
$match: {sex:1, age:10}
},
{
$group: {
_id: null,
anyFieldOne: {$sum: "$age"},
anyFieldTwo: {$sum: 1}
}},
{
$project: {
_id: 0,
anyFieldThree:"$anyFieldOne",
anyFieldFour:"$anyFieldTwo"
}
}
])

输出:
{ "anyFieldThree" : 20, "anyFieldFour" : 2 }
  • $group,按性别分组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
db.user.aggregate([ 
{
$group: {
_id: "$sex",
total: {$sum: "$age"},
}
}
])

输出:

{ "_id" : 2, "total" : 36 }
{ "_id" : 1, "total" : 31 }

  • $project
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
db.user.aggregate([ 
{
$group: {
_id: "$sex",
total: {$sum: "$age"},
}
},
{
$project: {
_id: 0,
totalAge: "$total"
}
}
])

{ "totalAge" : 36 }
{ "totalAge" : 31 }
  • $switch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
db.user.aggregate([
{
$match: {
sex : {
$in : [1, 2]
}
}
},
{
$project: {
_id: 0,
sex: {
$switch: {
branches: [
{case : {$eq: ["$sex", 1]}, then : "男"},
{case : {$eq: ["$sex", 2]}, then : "女"},
],
default : "保密"
}
},
name: 1
}
}
])

输出:

{ "name" : "张二", "sex" : "男" }
{ "name" : "张三", "sex" : "男" }
{ "name" : "李四", "sex" : "男" }
{ "name" : "王五", "sex" : "女" }
{ "name" : "马六", "sex" : "女" }
{ "name" : "封七", "sex" : "女" }
  • $literal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
db.user.aggregate([
{
$project: {
_id: 1,
name: 1,
age: 1,
"男":{
$eq: ["$sex", {$literal:1}]
}
}
}
])

输出:

{ "_id" : ObjectId("5e9567bda4e8d95babdea321"), "name" : "张二", "age" : 10, "男" : true }
{ "_id" : ObjectId("5e95680ea4e8d95babdea322"), "name" : "张三", "age" : 10, "男" : true }
{ "_id" : ObjectId("5e95680ea4e8d95babdea323"), "name" : "李四", "age" : 11, "男" : true }
{ "_id" : ObjectId("5e95680ea4e8d95babdea324"), "name" : "王五", "age" : 12, "男" : false }
{ "_id" : ObjectId("5e95680ea4e8d95babdea325"), "name" : "马六", "age" : 11, "男" : false }
{ "_id" : ObjectId("5e95680ea4e8d95babdea326"), "name" : "封七", "age" : 13, "男" : false }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
db.movies.aggregate([
{ $group: {
_id: { movieId: "$movieId", title: "$title" ,genres:"$genres",tags:"$tags" },
uniqueIds: { $addToSet: "$_id" },
count: { $sum: 1 }
}},
{ $match: {
count: { $gt: 1 }
}}
])

db.getCollection('movies').aggregate([
{$match:{"title":"Toy Story (1995)"}},
{$unwind:"$tags"}
])

四、参考

  1. 参考一
  2. 参考二
  3. 参考三