关闭

mongoDB的深入理解

300人阅读 评论(0) 收藏 举报
分类:

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
}

limitskip:跳过指定数量的文档,返回剩下的文档
sortgroup : 对所有的文档进行分组,然后进行聚集结果
firstgrouplast:返回group的最后一个值
maxgroupmin:返回group的最小值
avggroupsum返回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、输出一个新创建的文档

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

【MongoDB】深入了解MongoDB不可不知的十点

一、对象ID的生成 每个mongoDB文档那个都要求有一个主键,它在每个集合中对所有的文档必须是唯一的,主键存放在文档_id字段中。由12个字符组成; 4c291856       238d3b ...
  • sxb0841901116
  • sxb0841901116
  • 2014-11-01 19:53
  • 2575

【MongoDB】深入了解MongoDB不可不知的十点

一、对象ID的生成 每个mongoDB文档那个都要求有一个主键,它在每个集合中对所有的文档必须是唯一的,主键存放在文档_id字段中。由12个字符组成; 4c291856       238d3b ...
  • sxb0841901116
  • sxb0841901116
  • 2014-11-01 19:53
  • 2575

《深入理解计算机系统》笔记(三)链接知识【附图】

概述         ●该章节主要讲解的是ELF文件的结构。             ●静态库的概念       &#...
  • hherima
  • hherima
  • 2013-05-23 16:19
  • 3609

spring Ioc 容器深入理解<一>

IoC 概述     IOC是spring的内核,Aop、声明式事务都能功能都依赖于此功能,它涉及代码解耦,设计模式,代码优化的问题的考量。 ioc的初步理解     ioc的概...
  • wangqingqi20005
  • wangqingqi20005
  • 2016-09-08 23:14
  • 606

深入理解Servlet

简介  Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Ser...
  • u010926964
  • u010926964
  • 2016-01-28 15:57
  • 1873

深入理解WebView

摘要 作为Android开发者,我们都知道在手机中内置了一款高性能 webkit 内核浏览器,在 SDK 中封装为一个叫做 WebView 组件。今天就为大家讲讲Android中WebView的...
  • clx44551
  • clx44551
  • 2016-04-06 11:44
  • 377

hibernate深入理解-点滴记录

1.什么是hibernate  方言,如何配置方言? 通常我们会在hibernate.cfg.xml文件中这样配置: org.hibernate.dialect.Oracle10gDialect ...
  • zy846771221
  • zy846771221
  • 2015-10-20 17:14
  • 632

来着豆瓣经典点评《深入理解linux内核>>

曾几何时,我们为调试成功第一段汇编小程序而欢欣鼓舞,为写完C语言小程序通宵达旦,为自己的数据结构解决了一个实际问题而踌躇满志。再后来我们学习了计算机组成原理或者高级点的计算机系统结构,学习过操作系统的...
  • sinat_16790541
  • sinat_16790541
  • 2014-12-28 15:50
  • 1290

深入理解计算机系统第二章家庭作业答案(2.58-2.67)

2.58 bool is_little_endian() { unsigned int x = 1; return *((unsigned char*)&x); } 2.59 ...
  • phx_storm
  • phx_storm
  • 2014-07-15 17:03
  • 1099

深入理解Spring系列之一:开篇

Spring经过大神们的构思、编码,日积月累而来,所以,对其代码的理解也不是一朝一夕就能快速完成的。源码学习是枯燥的,需要坚持!坚持!坚持!当然也需要技巧,第一遍学习的时候,不用关注全部细节,不重要的...
  • tianruirui
  • tianruirui
  • 2016-10-30 20:18
  • 2386
    个人资料
    • 访问:30425次
    • 积分:926
    • 等级:
    • 排名:千里之外
    • 原创:73篇
    • 转载:1篇
    • 译文:0篇
    • 评论:14条
    文章分类
    最新评论