您的位置:首页 > 数据库 > Mongodb

mongoDB的深入理解

2016-08-30 16:10 239 查看

mongoDB的简介

分布式文件存储的NoSql

文档是mongoDB的基本单位,每一个文档都有与之对应的ID

文档里边可以是多个键值对

文档里边可以嵌套另一个文档

一个集合里边可以有多个文档

一个数据库里边可以有多个集合

聚集分析

1、管道模式进行聚集

常用的管道模式有以下

$match过滤文档,只传递匹配的文档到管道中的下一个步骤

db.book.insert({book_id:1,num:100,status:"normal"})
db.book.insert({book_id:2,num:200,status:"normal"})
db.book.insert({book_id:3,num:200,status:"sold"})
db.book.insert({book_id:1,num:200,status:"normal"})
db.price.aggregate([
{
$group:{
_id:"$book_id",
count:{$sum:1}
}
},
{$match:{count:{$gt:1}}
}
])


会返回的结果

{
"result" : [
{
"_id" : null,
"count" : 5
}
],
"ok" : 1
}


limit:限制管道中文档的数量skip:跳过指定数量的文档,返回剩下的文档

sort:对所有输入的文档进行排序group : 对所有的文档进行分组,然后进行聚集结果

first:返回group的第一个值last:返回group的最后一个值

max:返回group的最大值min:返回group的最小值

avg:返回group操作后的平均值sum返回group的所有的值的和

SELECT count(*)  as count1 from books


会返回 count1 4

等价于

db.book.aggregate([
{
$group:{
_id:null,
count1:{$sum:1}
}
}
])


SELECT sum(num)  as total from books


统计books表中所有num的和 会返回700

等价于

db.book.aggregate([
{
$group:{
_id:null,
sum:{$sum:"$num"}
}
}
])


SELECT book_id, sum(num) as total   from books  GROUP BY book_id


实现分别统计相同的book_id的总体的num值

db.book.aggregate([
{
$group:{
_id:"$book_id",
total:{$sum:"$num"}
}
}
])


MapReduce模聚集

为海量数据数据的查询分析,用mongoDB的做分布式,然后再用MapReduce 做数据分析

Select sum(num) as value,book_id as _id 6yh from books where status ="normal" group by book_id


查询到的结果为

value _id

300 1

200 2

使用mongoDB的执行

Db.books.mapreduce({

Function(){emit(this.book_id,this.num);},

Function(key,values){return Array.sum(values);},

{

Query:{status:"normal"},

Outresult:"books_totals"

}

})


代码分析:

以上相当于关系数据库中如下sql

Select sum(num) as value,book_id as _id 6yh from books where status =”normal” group by book_id

Mapreduce的解决方案:

定义一个map

Function(){emit(this.book_id,this.num);}

定义reduce

Function(key,values){return Array.sum(values);}

执行mapreduce函数

Query:{status:”normal”},返回状态为normal的值,同时定义了保存结果的集合名,最后的输出结果将保存在集合books_totals中。

注意:这里的map、reduce函数都是利用javascript编写的函数,其中map函数的关键部分是emit(key,value)函数,此函数的调用使集合使集合中的document对象按照key值生成一个value,形成一个键值对。其中key可以单一field,也可以由多个field组成,mongodb会按照key生成对应的value值,value为一个数组。

Reduc函数的定义中有参数key和value,其中key就是上面map函数中指定的key值,value就是对应key对应的值,Array.sum(value)这里是对数组中的值求和,按照不同的业务需要,我们可以编写自己的js函数来处理。

3、简单聚集函数

1、distinct函数

db.orders.distinct(key,)

第一个参数为filed 第二个参数为查询选择器

db.book.distinct("book_id")


会选择出所有文档中不同的book_id

2、count函数 用于统计查询返回的记录总数

db.book.find().count()


会返回4

node版原生的mongoDB驱动

1、声明依赖关系

2、定义数据库主机端口

3、建立数据库连接

4、创建数据库文档

5、输出一个新创建的文档
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: