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排序相关推荐

  1. python解包操作_python解包如何使用?

    对于一堆资料,我们可以把它分给不同的人使用,这个分散的过程,我们可以看成是解包方法是实现.当然实际python解包的使用会相对复杂一点,我们会对常见的列表.函数等进行操作.下面我们就Python解包的 ...

  2. python解包操作_python基础篇笔记02 文件操作 序列解包**星号语法

    文件的数据是存放于硬盘上的,因而只存在覆盖.不存在修改这么一说,我们平时看到的修改文件, 都是模拟出来的效果,具体的说有两种实现方式: 方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修 ...

  3. MongoDB——更新操作详解

    语法 db.collection.update(<query>, //update的查询条件<update>, //更新对象文档,含操作符功能使用{//可选参数upsert:& ...

  4. MongoDB——查询操作详解

    查询语法 db.collection_name.find (query, //查询条件projection //可选,指定需要返回的字段:默认返回所有字段 ) 查询集合所有文档 可以在find()后调 ...

  5. MongoDB——聚合操作详解

    聚合(Aggregation)为集合文档数据提供各种处理数据方法,并返回计算结果. MongoDB提供了3种方式来执行聚合命令: 聚合管道方法 map-reduce方法 单一目标聚合方法 1. 聚合管 ...

  6. c++随机打乱数组_编程之路之php数组操作详解【文末有惊喜】

    一.数组的操作 数组是一种复合数据类型,是数据的集合. 数组中的数据称为元素,每个元素是由键和值组成的键值对. 二.数组分类 1.关联数组 数据是由键和值形式构成的数组,键和值有一定关系 $arr = ...

  7. js删除数组中指定元素_js中数组操作详解

    今天给大家带来一篇有关数组操作方法的文章. 新建数组 方法一:通过new运算符创建一个数组构造函数. var arr = new Array(); 方法二:通过方括号直接创建直接量数组. var ar ...

  8. 微信小程序 for循环 array数组操作详解

    一.for循环的使用 ①for(let i = 0 ; i < length ; ++i){ } 示例: for(let i=0;i<length;++i){console.log(tem ...

  9. mongodb 字符串 截取_Mongodb split字符串后分组统计

    db.getCollection('Information').aggregate([{ $project : { birth : { $split: ["$birthday", ...

最新文章

  1. zookeeper和duboo 没用
  2. java面试 内存中堆和栈的区别
  3. os和sys模块的常用方法
  4. 性能监控工具javamelody与spring的集成
  5. 2018年12月份最热门的Java开源项目
  6. 波士顿动力十年对比刷屏,网友:以后该不会变成终结者吧?
  7. python序列操作_序列操作
  8. 思科GNS3和华为eNSP完美结合
  9. 小米 MIUI 主题制作
  10. JavaScript使用计时事件制作的电子时钟
  11. Android使用Socket.IO实现即时通讯
  12. 深度搜索算法(DFS)
  13. Linux---基础部分
  14. 阿里云机器学习PAI-快速上手指南
  15. 常用FPGA相关的网址资源
  16. SpringBoot启动报错Could not resolve placeholder ‘XXX.XXX‘ in value
  17. 上网课的心得体会1000字_大学生上网课心得体会
  18. Photoshop-字体应用
  19. UPS(不间断电源)原理及运维
  20. 嗅球与视网膜中神经环路的异同

热门文章

  1. java基于ssm的电影院订票选座系统
  2. 面试官谈游戏开发入行--技术准备
  3. 纳米级完全删除MYSQL5.7以及一些吐槽
  4. [RUST]nightly版本安装和切换
  5. Trustie网站代码托管使用指南
  6. 数据库软件MySQL的下载与安装+Navicat for MySQL图形化管理界面的下载与连接
  7. 外购入库单,金蝶KIS旗舰版盘点机PDA,生产企业仓库条码管理进销存
  8. 优化计算机的主要操作,windows优化大师能执行哪些主要操作_windows优化大师使用教程有哪些信息?...
  9. 摄像头捕获视频流软件AMCAP使用教程(视频采集捕获处理媒体制作微型软件)
  10. CorelDRAW插件-GMS开发-VBA注册-机器码-CDR(八)