Mongo散记--安装&聚合(aggregation)& 查询(Query)
来源:互联网 发布:linux u盘挂载位置 编辑:程序博客网 时间:2024/05/17 07:04
mongo官网:http://www.mongodb.org/
工作中使用到Mongo,但是没有系统的学习研究过Mongo,仅对工作过程中,在Mongo的使用过程中的一些知识点做一下记录,并随时补充,达到总结备忘的目的。
本篇主要记录安装启动、聚合和查询。
安装
下载mongo,解压后,拷贝到一个位置,比如:/data/mongo3.0.1。配置一个配置文件mongod.conf,内容如下:
# 数据库文件保存位置dbpath=/data/mongo3.0.1/db# 日志文件存放位置logpath=/data/mongo3.0.1/log/mongod.log# 以追加方式写入日志logappend=true# 是否已守护进程方式运行(后台运行)fork=true# 设置端口(默认27017)#port=27017# Enables periodic logging of CPU utilization and I/O wait# 启用定期记录CPU利用率和 I/O 等待#cpu=true#磁盘剩余空间不足4G,用这个参数smallfiles=true
设置一个启动命令,vim /data/mongo3.0.1/startmongo.sh,内容如下:
/data/mongo3.0.1/bin/mongod -f /data/mongo3.0.1/mongod.conf
然后把这个命令,加入启动列表,即可:vim /etc/rc.local
为了更方便的使用mongo命令,可以把mongo加入环境变量,vim /etc/profile,增加一行:
export MONGO_HOME=/data/mongo3.0.1export PATH=$PATH:$MONGO_HOME/bin
聚合(aggregation)
Count
db.view_view.count()
db.view_view.count({_id:"521842"})
db.view_view.find().count()
db.view_view.find({_id:"521842"}).count()
Distinct
db.view_view.distinct("_id")
db.view_view.distinct("view") view是个数组,会把每个数组的元素都distinct一下
Group
db.invoke_stat.group({ key:{ip:true}, cond:{ date:{$gte:ISODate("2014-07-09 16:00:00"),$lt:ISODate("2014-07-10 16:00:00")} }, reduce:function(curr,result){ result.count += curr.times; }, initial:{count:0}, finalize:function(result) {result.count = '$' + result.count}});db.view_view.group({ keyf:function(doc){return {view_num:doc.view.length}}, reduce:function(curr,result){ result.count += 1; result.id = curr._id; }, initial:{count:0}});
关于以上两个group的解释:
key/keyf:要按照进行分组的列,key是直接选取表中的列,kef是一个函数,对列进行一些处理,函数结果要返回一个对象,比如{view_num:doc.view.length},doc.view.length,是表中的数组列view的长度。
cond:是要过滤的查询条件
reduce:处理函数
initial:返回列的初始值
finalize:对reduce的结果进行进一步处理,比如格式化
MapReduce
db.invoke_stat.mapReduce( function(){ var key = this.ip; emit(key,{r_times:this.times}) }, function(key,emits){ total=0; for(var k in emits) { total+=emits[k].r_times; } return {r_times:total} }, {out:'mr'})
以上:r_times是我们定义的要返回的列的名称,ip和times是表中的列,mr是我们要把MapReduce的计算结果存入名称为mr的集合中。
mapReduce的原型为:function (map, reduce, optionsOrOutString),下面具体介绍一下函数的三个参数:
map函数,它会遍历集合中的每一个文档,this表示文档,它使用emit方法将文档按键分组,并返回需要统计的数据;
reduce函数,它将收集数据并统计,两个参数分别为map函数返回的key值和数据数组;
optionsOrOutString参数为一个对象,定义了一些额外工作,比如上面的列子中使用out参数将统计结果放入到mr集合中,集合不存在则创建,存在了则覆盖。
参数optionsOrOutString对象除了out键以外还有其它一些键:
finalize函数,同group的finalize完成器一样,可以对reduce的结果做一些处理;
query文档,在map函数前对文档过滤;
sort文档,在map函数前对文档排序,必须先对排序的字段建立索引;
limit整数,在map函数前设定文档数量;
scope文档,js函数中用到的变量,客户端可以通过scope传递一些值;
jsMode布尔,指定了map和reduce函数间传递的对象使用BSON格式还是javascript对象,默认值false,表示采用BSON格式,优点是中间的BSON数据会被存在硬盘上,所以传递的数据量可以很大,但会影响性能;采用javascript对象,性能较高,但只能传递50万个不同的key值;
verbos布尔,默认true,显示详细的时间统计信息。
以上可以看出MapReduce的强大,可以很轻松的实现不同的统计功能。
查询(Query)
mongo查询语法:
db.access_logs_140701.find({jxTime:{$gt:1407011300,$lt:1407011400},"curl.sku":"99978033"}).sort({jxTime:-1}).skip(1).limit(100)
db.access_logs_201501.find({jxTime:{$gt:1501120000,$lt:1501121750},"curl.type":{$nin:[40,41,42,43]}}).size()
db.invoke_stat.find({date:{$gte:ISODate("2014-07-09 10:00:00"),$lt:ISODate("2014-07-09 11:00:00")}})
db.view_view.find({view:{$size:10}}) 查询数组长度为10的,当前Mongo不直接支持数据长度范围查询,比如查询数据长度<10的,只能MapReduce编程实现
备份还原导入导出
mongodump/mongorestore:既可以对数据库备份还原,也可以对表备份还原,完成后在目录下有两个文件.json(描述文件)和.bson(数据文件),命令演示如下:
./mongodump -d recommend -c access_logs_121110 -o /data/mongobackup/recommend/access_logs_121110
把recommend库的access_logs_121110表备份到一个目录下
./mongorestore -d recommend -c access_logs_121110 --directoryperdb /data/mongobackup/recommend/access_logs_121110/recommend/access_logs_121110.bson
还原数据到表中
命令在各个版本中是稍有差别的,比如在3.0中,--directoryperdb参数就没有了,变成了dir,所以还是要经常看--help来研究使用办法。
mongorestore -d sia_db -c sia_collection --drop --dir=/root/sia_db/sia_collection.bson
mongodump数据备份,1G数据大约花费30秒;mongorestore数据还原,1G数据大约花费5-6分钟。
mongoimport/mongoexport可以对表执行数据导入导出,mongoexport数据导出时,不会导出索引,mongoimport数据导入时,对于自动的_id会重新赋值,这个要注意下。
mongodb删除集合后磁盘空间不释放,只有用db.repairDatabase()去修复才能释放。如果是删除库,则会立马释放空间,硬盘上相应库的数据文件会被删除。
但是在修复的过程中如果出现了非正常的mongodb的挂掉,再次启动时启动不了的,需要先修复才可以,可以利用./mongod --repair --dbpath=/data/mongo/ 。
如果你是把数据库单独的放在一个文件夹中指定dbpath时就指向要修复的数据库就可以,修复可能要花费很长的时间,在使用db.repairDatabase()去修复时一定要停掉读写,并且mongodb要有备机才可以,不然千万不要随便使用db.repairDatabase()来修复数据库。
创建数据库及用户管理
use test:创建数据库,如果之后不做任何操作退出,则数据库会被自动删除
show users:查看用户
db.addUser("username","password"):增加用户
- Mongo散记--安装&聚合(aggregation)& 查询(Query)
- MongoDB Aggregation 聚合管道(Aggregation Pipeline)
- mongo分组聚合(sum)在java中的用户:Aggregation agg = newAggregation();
- mongo(六)Mongo Query
- MongoDB : Aggregation mongo聚合操作详细说明
- MongoDB学习系列(二)mongo聚合查询实例
- java MongoDB 聚合查询aggregation
- MongoDB 聚合管道(一)(Aggregation Pipeline)
- MongoDB 聚合管道(二)(Aggregation Pipeline)
- MongoDB 聚合管道(Aggregation Pipeline)
- MongoDB 聚合管道(一)(Aggregation Pipeline)
- MongoDB 聚合管道(二)(Aggregation Pipeline)
- 从头认识java-6.1 聚合(aggregation)
- MongoDB 聚合管道(Aggregation Pipeline)
- MongoDB 聚合管道(Aggregation Pipeline)
- Mongodb 聚合管道(Aggregation Pipeline)
- Elasticsearch--Aggregation详细总结(聚合统计)
- MongoDB 聚合管道(一)(Aggregation Pipeline)
- jQuery之map()和get()
- UIView设置背景图片的方法
- UVA 674 (入门DP, 14.07.09)
- git的patch功能
- vlc for iOS 编译
- Mongo散记--安装&聚合(aggregation)& 查询(Query)
- vs2010插入分隔符在MFC中
- IOS UIScrollView
- 财哥面京东dm的经历【帮财哥发的】
- UI-MySQL
- C语言泛型编程技术(linux,mysql广泛应用)
- C语言程序编写
- clear方法会把整个map清空吗?
- POJ 3278 Catch That Cow 搜索