你的位置:首页 > 数据库

[数据库]MySQL与Mongo简单的查询 1


首先在这里我就不说关系型数据库与非关系型数据库之间的区别了(百度上有很多)直接切入主题

我想查询的内容是这样的:分数大于0且人名是bob或是jake的总分数   平均分数   最小分数   最大分数   计数

举这个实例来试试用MySQL和mongodb分别写一个查询

首先我们先做一些准备工作

MySQL的数据库结构如下

1 CREATE TABLE `new_schema`.`demo` (2  `id` INT NOT NULL,3  `person` VARCHAR(45) NOT NULL,4  `score` VARCHAR(45) NOT NULL,5  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}

 

以上就是一个简单查询的例子