MongoDb数组操作 - unwind解包、group分组统计、sort排序
MongoDB统计文档(Document)的数组(Array)中的各个元素出现的次数
一,问题描述
【使用 unwind 操作符 “解包” Document 里面的Array中的每个元素,然后使用 group 分组统计,最后使用 sort 对分组结果排序】
从 images.json 文件中导入数据到MongoDB服务器
mongoimport --drop -d test -c images images.json
其中Document的示例如下:
> db.images.find()
{ "_id" : 3, "height" : 480, "width" : 640, "tags" : [ "kittens", "travel" ] }
{ "_id" : 1, "height" : 480, "width" : 640, "tags" : [ "cats", "sunrises", "kittens", "travel", "vacation", "work" ] }
{ "_id" : 0, "height" : 480, "width" : 640, "tags" : [ "dogs", "work" ] }
{ "_id" : 6, "height" : 480, "width" : 640, "tags" : [ "work" ] }
{ "_id" : 4, "height" : 480, "width" : 640, "tags" : [ "dogs", "sunrises", "kittens", "travel" ] }
{ "_id" : 5, "height" : 480, "width" : 640, "tags" : [ "dogs", "cats", "sunrises", "kittens", "work" ] }
{ "_id" : 7, "height" : 480, "width" : 640, "tags" : [ "dogs", "sunrises" ] }
{ "_id" : 8, "height" : 480, "width" : 640, "tags" : [ "dogs", "cats", "sunrises", "kittens", "travel" ] }
现在要统计: 所有Document中的 tags 数组里面的每个元素 出现的次数。即:"kittens"出现了多少次?"travel"出现了多少次?"dogs"出现了多少次?……
二,实现步骤
使用MongoDB的Aggregate操作进行实现
①使用 unwind 分解 tags 数组,得到的结果如下:
> db.images.aggregate(
... [
... {$unwind:"$tags"}
... ]){ "_id" : 3, "height" : 480, "width" : 640, "tags" : "kittens" }
{ "_id" : 3, "height" : 480, "width" : 640, "tags" : "travel" }
{ "_id" : 1, "height" : 480, "width" : 640, "tags" : "cats" }
{ "_id" : 1, "height" : 480, "width" : 640, "tags" : "sunrises" }
{ "_id" : 1, "height" : 480, "width" : 640, "tags" : "kittens" }
{ "_id" : 1, "height" : 480, "width" : 640, "tags" : "travel" }
{ "_id" : 1, "height" : 480, "width" : 640, "tags" : "vacation" }
{ "_id" : 1, "height" : 480, "width" : 640, "tags" : "work" }
{ "_id" : 0, "height" : 480, "width" : 640, "tags" : "dogs" }
{ "_id" : 0, "height" : 480, "width" : 640, "tags" : "work" }
{ "_id" : 6, "height" : 480, "width" : 640, "tags" : "work" }
{ "_id" : 4, "height" : 480, "width" : 640, "tags" : "dogs" }
{ "_id" : 4, "height" : 480, "width" : 640, "tags" : "sunrises" }
.....
.....
②将分解后的每个 tag 进行 group 操作
对于group操作而言,_id 指定了 分组 的字段(对哪个字段进行 group by 操作),分组操作之后生成的结果由 num_of_tag 字段标识
> db.images.aggregate(
... [
... {$unwind:"$tags"},
... {$group:{_id:"$tags",num_of_tag:{$sum:1}}}
... ]
... ){ "_id" : "dogs", "num_of_tag" : 49921 }
{ "_id" : "work", "num_of_tag" : 50070 }
{ "_id" : "vacation", "num_of_tag" : 50036 }
{ "_id" : "travel", "num_of_tag" : 49977 }
{ "_id" : "kittens", "num_of_tag" : 49932 }
{ "_id" : "sunrises", "num_of_tag" : 49887 }
{ "_id" : "cats", "num_of_tag" : 49772 }
③使用 project 去掉不感兴趣的 _id 字段(其实这里是将 _id 字段名 替换为 tags 字段名)(这一步可忽略)
project操作,_id:0 表示去掉_id 字段;tags:"$_id",将 _id 字段值 使用tags 字段标识;num_of_tag:1 保留 num_of_tag 字段
> db.images.aggregate( [ {$unwind:"$tags"},{$group:{_id:"$tags",num_of_tag:{$sum:1}}},{$project:{_id:0,tags:"$_id",num_of_tag:1}} ])
{ "num_of_tag" : 49921, "tags" : "dogs" }
{ "num_of_tag" : 50070, "tags" : "work" }
{ "num_of_tag" : 50036, "tags" : "vacation" }
{ "num_of_tag" : 49977, "tags" : "travel" }
{ "num_of_tag" : 49932, "tags" : "kittens" }
{ "num_of_tag" : 49887, "tags" : "sunrises" }
{ "num_of_tag" : 49772, "tags" : "cats" }
④使用 sort 对 num_of_tag 字段排序
> db.images.aggregate( [ {$unwind:"$tags"},{$group:{_id:"$tags",num_of_tag:{$sum:1}}},{$project:{_id:0,tags:"$_id",num_of_tag:1}},{$sort:{num_of_tag:-1}} ])
{ "num_of_tag" : 50070, "tags" : "work" }
{ "num_of_tag" : 50036, "tags" : "vacation" }
{ "num_of_tag" : 49977, "tags" : "travel" }
{ "num_of_tag" : 49932, "tags" : "kittens" }
{ "num_of_tag" : 49921, "tags" : "dogs" }
{ "num_of_tag" : 49887, "tags" : "sunrises" }
{ "num_of_tag" : 49772, "tags" : "cats" }
三,总结
本文是MongoDB University M101课程 For Java Developers中的一次作业。结合Google搜索和MongoDB的官方文档,很容易就能实现MongoDB的各种组合查询。
相关MongoDB文章:
MongoDB 更新数组中的元素
MongoDB 组合多个条件查询(and、and、in、gte、gte、lte)
转载地址:http://www.cnblogs.com/hapjin/p/7944404.html
--》项目中的应用:
【查询排序】
var param = "2019-01-22 00:00:00";
db.getCollection('interfaceMonitorInfoDto').find({
"startTime":{
"$gt":param
},
"timeConsumed":{
"$gt":2000
}
}).sort({timeConsumed:-1})
var param = "2019-01-22 00:00:00";
db.getCollection('interfaceMonitorInfoDto').find({
"startTime":{
"$gt":param
},
"timeConsumed":{
"$gt":2000
}
},{"type":1
,"serverHost":1
,"className":1
,"methodName":1
,"startTime":1
,"endTime":1
,"args":1
,"timeConsumed":1}).sort({timeConsumed:-1}).limit(50)
【统计排序】
var startTime = "2019-01-24 00:00:00",
endTime = "2019-01-24 23:59:59";
db.getCollection('interfaceMonitorInfoDto').aggregate([
{$match: {
"startTime":{"$gte":startTime}
,"endTime":{"$lte":endTime}
,"timeConsumed":{"$gt":2000}
}
}
,{$group: {
_id: {
"className": "$className",
"methodName": "$methodName",
"subscriber_id": "$subscriber_id"
}
,cnt: { "$sum": 1 }
}
}
,{$sort:{cnt:-1}}
])
MongoDb数组操作 - unwind解包、group分组统计、sort排序相关推荐
- python解包操作_python解包如何使用?
对于一堆资料,我们可以把它分给不同的人使用,这个分散的过程,我们可以看成是解包方法是实现.当然实际python解包的使用会相对复杂一点,我们会对常见的列表.函数等进行操作.下面我们就Python解包的 ...
- python解包操作_python基础篇笔记02 文件操作 序列解包**星号语法
文件的数据是存放于硬盘上的,因而只存在覆盖.不存在修改这么一说,我们平时看到的修改文件, 都是模拟出来的效果,具体的说有两种实现方式: 方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修 ...
- MongoDB——更新操作详解
语法 db.collection.update(<query>, //update的查询条件<update>, //更新对象文档,含操作符功能使用{//可选参数upsert:& ...
- MongoDB——查询操作详解
查询语法 db.collection_name.find (query, //查询条件projection //可选,指定需要返回的字段:默认返回所有字段 ) 查询集合所有文档 可以在find()后调 ...
- MongoDB——聚合操作详解
聚合(Aggregation)为集合文档数据提供各种处理数据方法,并返回计算结果. MongoDB提供了3种方式来执行聚合命令: 聚合管道方法 map-reduce方法 单一目标聚合方法 1. 聚合管 ...
- c++随机打乱数组_编程之路之php数组操作详解【文末有惊喜】
一.数组的操作 数组是一种复合数据类型,是数据的集合. 数组中的数据称为元素,每个元素是由键和值组成的键值对. 二.数组分类 1.关联数组 数据是由键和值形式构成的数组,键和值有一定关系 $arr = ...
- js删除数组中指定元素_js中数组操作详解
今天给大家带来一篇有关数组操作方法的文章. 新建数组 方法一:通过new运算符创建一个数组构造函数. var arr = new Array(); 方法二:通过方括号直接创建直接量数组. var ar ...
- 微信小程序 for循环 array数组操作详解
一.for循环的使用 ①for(let i = 0 ; i < length ; ++i){ } 示例: for(let i=0;i<length;++i){console.log(tem ...
- mongodb 字符串 截取_Mongodb split字符串后分组统计
db.getCollection('Information').aggregate([{ $project : { birth : { $split: ["$birthday", ...
最新文章
- zookeeper和duboo 没用
- java面试 内存中堆和栈的区别
- os和sys模块的常用方法
- 性能监控工具javamelody与spring的集成
- 2018年12月份最热门的Java开源项目
- 波士顿动力十年对比刷屏,网友:以后该不会变成终结者吧?
- python序列操作_序列操作
- 思科GNS3和华为eNSP完美结合
- 小米 MIUI 主题制作
- JavaScript使用计时事件制作的电子时钟
- Android使用Socket.IO实现即时通讯
- 深度搜索算法(DFS)
- Linux---基础部分
- 阿里云机器学习PAI-快速上手指南
- 常用FPGA相关的网址资源
- SpringBoot启动报错Could not resolve placeholder ‘XXX.XXX‘ in value
- 上网课的心得体会1000字_大学生上网课心得体会
- Photoshop-字体应用
- UPS(不间断电源)原理及运维
- 嗅球与视网膜中神经环路的异同
热门文章
- java基于ssm的电影院订票选座系统
- 面试官谈游戏开发入行--技术准备
- 纳米级完全删除MYSQL5.7以及一些吐槽
- [RUST]nightly版本安装和切换
- Trustie网站代码托管使用指南
- 数据库软件MySQL的下载与安装+Navicat for MySQL图形化管理界面的下载与连接
- 外购入库单,金蝶KIS旗舰版盘点机PDA,生产企业仓库条码管理进销存
- 优化计算机的主要操作,windows优化大师能执行哪些主要操作_windows优化大师使用教程有哪些信息?...
- 摄像头捕获视频流软件AMCAP使用教程(视频采集捕获处理媒体制作微型软件)
- CorelDRAW插件-GMS开发-VBA注册-机器码-CDR(八)