一,问题描述

【使用 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)中的各个元素出现的次数相关推荐

  1. js如何往数组Array中添加删除元素

    原文:https://www.tmico.cn/wordpress/?p=222 数组常用方法: 1.pop 删除原数组最后一项,并返回删除元素的值:如果数组为空则返回undefined  2.pus ...

  2. 商城项目(六)整合Mongodb实现文档操作

    商城项目(六)整合Mongodb实现文档操作 整合Mongodb的过程,以实现商品浏览记录在Mongodb中的添加.删除.查询为例. 环境搭建 Mongodb Mongodb是为快速开发互联网Web应 ...

  3. MongoDB学习文档

    MongoDB 一.MongoDB特点 1.MongoDB优点 2.MongoDB缺点 二.MongoDB数据结构 三. 数据库 四.集合 五.文档 六.搭建复制集 一.MongoDB特点 1.Mon ...

  4. MongoDB之文档CRUD

    官网文档地址:https://docs.mongodb.com/manual/crud/ 创建文档 使用插入操作向一个集合中添加文档时,如果目标集合当前并不存在,执行操作会自动创建该集合. Mongo ...

  5. MongoDB插入文档

    db.collection.insertOne() 插入单个文档. db.collection.insertMany() 插入多个文档. db.collection.insert() 插入单/多个文档 ...

  6. Aspose.Words for .NET使用教程:将文档转换为字节数组和HTML

    Aspose.Words无需Microsoft Word也可在任何平台上满足Word文档的一切操作需求.本文将与大家分享如何将word和图像转换为PDF. 将Document(文档)转换为Byte A ...

  7. 开启MongoDB更新文档操作的正确姿势

    将文档存入数据库中之后,可以使用以下几种更新方法之一对其进行更改:updateOne.updateMany 和 replaceOne.updateOne 和 updateMany 都将筛选文档作为第一 ...

  8. mongodb查询文档

    mongodb查询文档 语法:db.集合名.find({条件}) 操作符使用频率最高的: 大于: $gt > 大于等于: $gte >= 小于: l t < 小 于 等 于 : lt ...

  9. mongodb插入文档时不传ObjectId

    type BookExt struct {ID bson.ObjectId `bson:"_id"`Title string `bson:"title"`Sub ...

最新文章

  1. CVPR2020:点云三维目标跟踪的点对盒网络(P2B)
  2. 纯Python实现Torch API,康奈尔副教授为自己的课程创建了DIY教学库
  3. 逻辑模型设计步骤-粒度层次划分
  4. windows server 2008 如何取消禁ping
  5. Call Exec in PeopleCode
  6. Extjs 动态生成表格
  7. c++读取和写入TXT文件的整理 1
  8. OpenDaylight风头正劲,华三通信在其中大显身手
  9. idea ****.class拒绝访问
  10. 【最长上升子序列】HDU 1087——Super Jumping! Jumping! Jumping!
  11. 学生管理系统总结(c语言)
  12. 通过【Windows10安装程序---MediaCreationTool】来制作并安装Win10正式版
  13. 数控铣床法兰克系统代码完整版
  14. BIM标准化系列写作思路
  15. 黑马程序员——面试题之银行业务调度系统
  16. 如何保持session一致性?
  17. 表征学习 Representation Learning(特征学习、表示学习)是什么?
  18. Counterfeit Dollar(找硬币)
  19. 计算机打印机提示无法打印,打印机无法打印_打印机无法打印怎么办【步骤|图文教程】-太平洋IT百科...
  20. Qml SwipeView禁用滑动动画

热门文章

  1. KNN实现手写数字识别(Python-OpenCV)
  2. 库乐队历史版本怎么下载_库乐队电脑版下载|GarageBand电脑版 V2.4.4 官方最新版 下载_当下软件园_软件下载...
  3. 一起走过的日子 - 高校俱乐部2014上半年校园活动精彩回顾
  4. smartdeblur有手机版吗_SmartDeblur官方版下载_SmartDeblur2.3 官方版 - Win7旗舰版
  5. Android 蓝牙学习
  6. 避免常见的6种HTML5错误用法,避免常见的6种HTML5错误用法
  7. 皮格马利翁效应:从平庸到非凡,如何激发潜能?
  8. Ubuntu系统 E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)
  9. sublime package control 速度很慢_可怜的ACRH17,它的USB3.0速度被华硕压制了!
  10. 唐山联通助“智慧城市”开花