MongoDB学习教程

先看下要操作的主要数据结构:

{
"_id" : "000015e0-3e9c-40b3-bd0d-6e7949f455c0",
"evaluation_type" : 2,
"reply_count" : 5,
"type" : 3,
"content" : "怎么编制余额调节表",
"tips" : [
{
"_id" : 1000,
"tip_name" : "会计基础"
}
],
"teach_id" : 10298153
}

看这个文档数据,现在要以 tips 数组下的 _id 做数据的分组查询。在查询条件中使用 "tips.0._id":1000 过滤数据是可以生效的,但用在 aggregate 聚合查询中的 group 分组条件中是不行的,必须得先使用 $unwind (文档地址)把 tips 这个数组对象变成扁平的结构(把数组中的每个对象拆分出来与当前文档重新组合,达到消数组的效果)

上面数据根据以下查询语句的前后变化

扁平化前:

db.getCollection('topics').find({"teach_id":10010943})

扁平化后:

db.getCollection('topics').aggregate({'$match':{"teach_id":10010943}},{'$unwind':'$tips'})

关注扁平化前后 tips 由数组变成了对象

通过 {'$unwind' : '$tips'} 对文档扁平化结构之后,然后再用 pipeline (管道)的方式做聚合就好了,

可以直接根据 tips._id 进行分组了

查询语句:

db.getCollection('topics').aggregate({'$match':{"teach_id":10010943}},{'$unwind':'$tips'},
{'$group':{'_id':{"tipId":'$tips._id',"tipName":'$tips.tip_name',"evaluationType":'$evaluation_type'},"count":{'$sum': 1}}},
{'$project':{"tipId":'$_id.tipId',"tipName":'$_id.tipName',"evaluationType":'$_id.evaluationType',"count":'$count'}})

完美滴根据 tipId,tipName,evaluationType 分好组了

关注公众号,分享干货,讨论技术

MongoDB 聚合嵌入的数组(扁平化数据+管道)的更多相关文章

  1. JavaScript数组常用方法解析和深层次js数组扁平化

    前言 数组作为在开发中常用的集合,除了for循环遍历以外,还有很多内置对象的方法,包括map,以及数组筛选元素filter等. 注:文章结尾处附深层次数组扁平化方法操作. 作为引用数据类型的一种,在处 ...

  2. JS: 数组扁平化

    数组扁平化 什么是数组扁平化? 数组扁平化就是将一个多层嵌套的数组 (Arrary) 转化为只有一层. // 多层嵌套 [1, 2, [3, 4]] // 一层 [1, 2, 3, 4] 递归实现 思 ...

  3. js技巧-使用reduce实现更简洁的数组对象去重和数组扁平化

    Array.prototype.reduce()方法介绍: 感性认识reduce累加器: const arr = [1, 2, 3, 4]; const reducer = (accumulator, ...

  4. JS数组专题1️⃣ ➖ 数组扁平化

    一.什么是数组扁平化 扁平化,顾名思义就是减少复杂性装饰,使其事物本身更简洁.简单,突出主题. 数组扁平化,对着上面意思套也知道了,就是将一个复杂的嵌套多层的数组,一层一层的转化为层级较少或者只有一层 ...

  5. js多维数组扁平化

    数组扁平化,就是将多维数组碾平为一维数组,方便使用. 一:例如,一个二维数组 var arr = ['a', ['b', 2], ['c', 3, 'x']],将其扁平化: 1.  通过 apply ...

  6. javascrip的数组扁平化

    扁平化 数组的扁平化,就是将一个嵌套多层的数组 array (嵌套可以是任何层数)转换为只有一层的数组. 举个例子,假设有个名为 flatten 的函数可以做到数组扁平化,效果就会如下: var ar ...

  7. js中数组扁平化处理

  8. js实现数组扁平化

    数组扁平化的方式 什么是数组扁平化? 数组扁平化:指将一个多维数组转化为一个一维数组. 例:将下面数组扁平化处理. const arr = [1, [2, 3, [4, 5]]] // ---> ...

  9. js数组扁平化

    看到一个有趣的题目: var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]; 一个多维 ...

随机推荐

  1. Python中的字典详解

    https://www.cnblogs.com/yjd_hycf_space/p/6880026.html

  2. 搭建ZooKeeper

    从http://zookeeper.apache.org/ 官网上下载最新的zookeeper版本, 我下载的版本是 zookeeper-3.4.6.tar.gz, 解压: 配置conf/zoo.cf ...

  3. 我的IT未来

    关于IT这个行业,我是持欣赏态度的,毕竟发展很快,对人们生活的改变也很大,所以,作为一个从事IT的人士,我很自豪. 读了刘先生的文章,我发现以前自己做的太少了,虽然偶尔也会吐血写程序,但还是太少了.以 ...

  4. VS2013安装及测试练习

    一.安装过程 任务:安装VS2010以上的版本. 其实很闹心,因为看了一下VS的安装包,都很大.以学校的网速,得下到什么时候?这是第一想法. 挺麻烦,也挺周折,最终下好了安装包.但是,还是出了问题,在 ...

  5. ElasticSearch 2 (2) - Setup

    ElasticSearch 2.1.1 (2) - Setup Installation Elasticsearch can be started using: $ bin/elasticsearc ...

  6. 共享服务Samba,实现liunx与Windows文件共享

    Samba服务程序 是一款SMB协议并有服务器和客户端组成的开源文件共享软件,实现了Linux 与Windows系统之间的文件共享 Samba的配置文件有太多注释的东西,为了方便使用下面的命令,可以更 ...

  7. 累计进度条 PSP

    每周例行报告 本周PSP 类别 任务 开始时间 结束时间 被打断时间 总计工作时间    11月16日 代码 参与团队项目 10:05 12:12 15 112min 写博客 进度统计 21:52 2 ...

  8. Jmeter使用笔记之意料之外的

    以下是在测试过程中按照以前loadrunner的思维来做的一点区别: 一.组织方式之setup 在用loadrunner做接口测试的时候如果不是针对login的测试,那么一般也会把login接口放到i ...

  9. [转帖]VMware Vsphere 6.0安装部署 (三) vCenter Server安装

    VMware Vsphere 6.0安装部署 (三) vCenter Server安装 2016年08月29日 14:59:14 dAng1r0Us 阅读数:72942   版权声明:本文为博主原创文 ...

  10. SpringBoot 5.SpringBoot小知识讲解

    1.修改 server 端口: 在 application.properties 中添加 server.port=9090,我们的端口号就会变成9090了. 2.自定义配置Web: 2.1 创建 Cu ...