首先在这里我就不说关系型数据库与非关系型数据库之间的区别了(百度上有很多)直接切入主题
我想查询的内容是这样的:分数大于0且人名是bob或是jake的总分数 平均分数 最小分数 最大分数 计数
举这个实例来试试用MySQL和mongodb分别写一个查询
首先我们先做一些准备工作
MySQL的数据库结构如下
1
2
3
4
5
|
CREATE TABLE `new_schema`.`demo` ( `id` INT NOT NULL , `person` VARCHAR (45) NOT NULL , `score` VARCHAR (45) NOT NULL , PRIMARY KEY (`id`)); |
建完表之后我们来插入一些数据
1
2
3
4
5
|
INSERT INTO `new_schema`.`demo` (`id`, `person`, `score`) VALUES ( '1' , 'bob' , '50' ); INSERT INTO `new_schema`.`demo` (`id`, `person`, `score`) VALUES ( '2' , 'jake' , '60' ); INSERT INTO `new_schema`.`demo` (`id`, `person`, `score`) VALUES ( '3' , 'bob' , '100' ); INSERT INTO `new_schema`.`demo` (`id`, `person`, `score`) VALUES ( '6' , 'jake' , '100' ); INSERT INTO `new_schema`.`demo` (`id`, `person`, `score`) VALUES ( '8' , 'li' , '100' ); |
我截个图方便看一下结构
好 接下来我们进入mongodb的准备工作 看一下建立的mongodb的集合里面文档的结构(基本跟MySQL一毛一样)在这里我就不写插入文档的具体过程了 (为了便看mongodb的显示我都用两种格式显示:一个是表哥模块显示 一个是文本模块显示)
这个是表格模块显示
这个是文本模块显示
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
|
/* 1 */ { "_id" : ObjectId( "58043fa8e9a7804c05031e17" ), "person" : "bob" , "sorce" : 50 } /* 2 */ { "_id" : ObjectId( "58043fa8e9a7804c05031e18" ), "person" : "bob" , "sorce" : 100 } /* 3 */ { "_id" : ObjectId( "58043fa8e9a7804c05031e19" ), "person" : "jake" , "sorce" : 60 } /* 4 */ { "_id" : ObjectId( "58043fa8e9a7804c05031e1a" ), "person" : "jake" , "sorce" : 100 } /* 5 */ { "_id" : ObjectId( "58043fa8e9a7804c05031e1b" ), "person" : "li" , "sorce" : 100 } |
开始进入正题
现在我想查的MySQL语句是这样的(分数大于0且人名是bob或是jake的总分数 平均分数 最小分数 最大分数 计数)
1
2
3
4
|
SELECT person, SUM (score), AVG (score), MIN (score), MAX (score), COUNT (*) FROM demo WHERE score > 0 AND person IN ( 'bob' , 'jake' ) GROUP BY person; |
下面开始用Mongo写出这个查询
首先想到的是聚合框架
先用$match过滤 分数大于0且人名是bob或是jake
1
2
3
4
5
6
7
8
9
|
db.demo.aggregate( { "$match" :{ "$and" :[ { "sorce" :{ "$gt" :0}}, { "person" :{ "$in" :[ "bob" , "jake" ]}} ] } } |
得到这个结果
这个是表哥模块显示的结果:
这个是文本模块显示的结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/* 1 */ { "_id" : ObjectId( "58043fa8e9a7804c05031e17" ), "person" : "bob" , "sorce" : 50 } /* 2 */ { "_id" : ObjectId( "58043fa8e9a7804c05031e18" ), "person" : "bob" , "sorce" : 100 } /* 3 */ { "_id" : ObjectId( "58043fa8e9a7804c05031e19" ), "person" : "jake" , "sorce" : 60 } /* 4 */ { "_id" : ObjectId( "58043fa8e9a7804c05031e1a" ), "person" : "jake" , "sorce" : 100 } |
然后想要分组并且显示最大 最小 总计 平均值 和计数值
那么$group派上用场了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
db.demo.aggregate( { "$match" :{ "$and" :[ { "sorce" :{ "$gt" :0}}, { "person" :{ "$in" :[ "bob" , "jake" ]}} ] } }, { "$group" :{ "_id" : "$person" , "sumSorce" :{ "$sum" : "$sorce" }, "avgSorce" :{ "$avg" : "$sorce" }, "lowsetSorce" :{ "$min" : "$sorce" }, "highestSorce" :{ "$max" : "$sorce" }, "count" :{ "$sum" :1}} } ) |
得到的结果就是 分数大于0且人名是bob或是jake的总分数 平均分数 最小分数 最大分数 计数
结果的表格模块显示:
结果的文本模块显示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/* 1 */ { "_id" : "bob" , "sumSorce" : 150, "avgSorce" : 75.0, "lowsetSorce" : 50, "highestSorce" : 100, "count" : 2.0 } /* 2 */ { "_id" : "jake" , "sumSorce" : 160, "avgSorce" : 80.0, "lowsetSorce" : 60, "highestSorce" : 100, "count" : 2.0 } |
以上所述是小编给大家介绍的MySQL与Mongo简单的查询实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:http://www.cnblogs.com/moon1223/archive/2016/10/17/5969400.html