首先在这里我就不说关系型数据库与非关系型数据库之间的区别了(百度上有很多)直接切入主题
我想查询的内容是这样的:分数大于0且人名是bob或是jake的总分数 平均分数 最小分数 最大分数 计数
举这个实例来试试用MySQL和mongodb分别写一个查询
首先我们先做一些准备工作
MySQL的数据库结构如下
- CREATE TABLE `new_schema`.`demo` (
- `id` INT NOT NULL,
- `person` VARCHAR(45) NOT NULL,
- `score` VARCHAR(45) NOT NULL,
- PRIMARY KEY (`id`));
建完表之后我们来插入一些数据
- 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 */
- {
- "_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的总分数 平均分数 最小分数 最大分数 计数)
- 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
- db.demo.aggregate(
- {
- "$match":{
- "$and":[
- {"sorce":{"$gt":0}},
- {"person":{"$in":["bob","jake"]}}
- ]
- }
- }
得到这个结果
这个是表哥模块显示的结果:
这个是文本模块显示的结果:
- /* 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派上用场了:
- 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 */
- {
- "_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

2016年10月19日 下午3:55 1F
很详细的MySQL与Mongo简单的查询实例代码
2017年2月14日 下午5:08 2F
很受用