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、$in、$gte、$lte)
原文:http://www.cnblogs.com/hapjin/p/7944404.html
转载于:https://www.cnblogs.com/hapjin/p/7944404.html
MongoDB统计文档(Document)的数组(Array)中的各个元素出现的次数相关推荐
- js如何往数组Array中添加删除元素
原文:https://www.tmico.cn/wordpress/?p=222 数组常用方法: 1.pop 删除原数组最后一项,并返回删除元素的值:如果数组为空则返回undefined 2.pus ...
- 商城项目(六)整合Mongodb实现文档操作
商城项目(六)整合Mongodb实现文档操作 整合Mongodb的过程,以实现商品浏览记录在Mongodb中的添加.删除.查询为例. 环境搭建 Mongodb Mongodb是为快速开发互联网Web应 ...
- MongoDB学习文档
MongoDB 一.MongoDB特点 1.MongoDB优点 2.MongoDB缺点 二.MongoDB数据结构 三. 数据库 四.集合 五.文档 六.搭建复制集 一.MongoDB特点 1.Mon ...
- MongoDB之文档CRUD
官网文档地址:https://docs.mongodb.com/manual/crud/ 创建文档 使用插入操作向一个集合中添加文档时,如果目标集合当前并不存在,执行操作会自动创建该集合. Mongo ...
- MongoDB插入文档
db.collection.insertOne() 插入单个文档. db.collection.insertMany() 插入多个文档. db.collection.insert() 插入单/多个文档 ...
- Aspose.Words for .NET使用教程:将文档转换为字节数组和HTML
Aspose.Words无需Microsoft Word也可在任何平台上满足Word文档的一切操作需求.本文将与大家分享如何将word和图像转换为PDF. 将Document(文档)转换为Byte A ...
- 开启MongoDB更新文档操作的正确姿势
将文档存入数据库中之后,可以使用以下几种更新方法之一对其进行更改:updateOne.updateMany 和 replaceOne.updateOne 和 updateMany 都将筛选文档作为第一 ...
- mongodb查询文档
mongodb查询文档 语法:db.集合名.find({条件}) 操作符使用频率最高的: 大于: $gt > 大于等于: $gte >= 小于: l t < 小 于 等 于 : lt ...
- mongodb插入文档时不传ObjectId
type BookExt struct {ID bson.ObjectId `bson:"_id"`Title string `bson:"title"`Sub ...
最新文章
- CVPR2020:点云三维目标跟踪的点对盒网络(P2B)
- 纯Python实现Torch API,康奈尔副教授为自己的课程创建了DIY教学库
- 逻辑模型设计步骤-粒度层次划分
- windows server 2008 如何取消禁ping
- Call Exec in PeopleCode
- Extjs 动态生成表格
- c++读取和写入TXT文件的整理 1
- OpenDaylight风头正劲,华三通信在其中大显身手
- idea ****.class拒绝访问
- 【最长上升子序列】HDU 1087——Super Jumping! Jumping! Jumping!
- 学生管理系统总结(c语言)
- 通过【Windows10安装程序---MediaCreationTool】来制作并安装Win10正式版
- 数控铣床法兰克系统代码完整版
- BIM标准化系列写作思路
- 黑马程序员——面试题之银行业务调度系统
- 如何保持session一致性?
- 表征学习 Representation Learning(特征学习、表示学习)是什么?
- Counterfeit Dollar(找硬币)
- 计算机打印机提示无法打印,打印机无法打印_打印机无法打印怎么办【步骤|图文教程】-太平洋IT百科...
- Qml SwipeView禁用滑动动画
热门文章
- KNN实现手写数字识别(Python-OpenCV)
- 库乐队历史版本怎么下载_库乐队电脑版下载|GarageBand电脑版 V2.4.4 官方最新版 下载_当下软件园_软件下载...
- 一起走过的日子 - 高校俱乐部2014上半年校园活动精彩回顾
- smartdeblur有手机版吗_SmartDeblur官方版下载_SmartDeblur2.3 官方版 - Win7旗舰版
- Android 蓝牙学习
- 避免常见的6种HTML5错误用法,避免常见的6种HTML5错误用法
- 皮格马利翁效应:从平庸到非凡,如何激发潜能?
- Ubuntu系统 E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)
- sublime package control 速度很慢_可怜的ACRH17,它的USB3.0速度被华硕压制了!
- 唐山联通助“智慧城市”开花