mongoDB中聚合(aggregate)的具体使用

我们可以用$指定字段来表示选定的document的field,另外可以使用$$ROOT来表示选定的document的所有内容(例如:chosenDocument: {$push: '$$ROOT'}

示例:按条件查找数据,将找到的结果进行排序并分组,并且需要返回分组后的所有文档内容;$push, $addToSet实现的功能一样

GrowthRecordSync.aggregate([
{ $match: cond },
{ $sort: {time_point: }},
{ $group: {
_id: { $year: "$time_point"},
count:{ $sum: },
result:{
// $addToSet: "$$ROOT"}
$push: "$$ROOT"}
}
},
{ $sort: {_id: }}
],cb)

结果:

"data": [
{
"_id": ,
"count": ,
"result": [
{
"_id": "5c514c3675844415dac30efc",
"createDate": "2019-01-30T07:03:18.000Z",
"lastModified": "2019-01-30T07:03:18.285Z",
"time_point": "2018-11-14T00:00:00.000Z",
"type": "entry",
"eveid": "5bf60a4dfdb0ed18594b8ce6",
"title": "A职",
"description": "",
"client": "584ec02dacbd274539b4ab16",
"people": "5bf60a4dfdb0ed18594b8ce6",
"people_no": "",
"people_name": "成成",
"ou_name": "啊总经办",
"ou": "5858a50bdc2a25120dcf5163",
"terminated": false,
"activate": true,
"block_reason": "",
"block": false,
"validTo": "9999-12-31T15:59:59.999Z",
"validFrom": "2019-01-29T16:00:00.000Z",
"__v":
}
]
},
{
"_id": ,
"count": ,
"result": [
{
"_id": "5c6a979b1a921a16cc592fac",
"createDate": "2019-02-18T11:31:39.000Z",
"lastModified": "2019-02-18T11:31:39.062Z",
"client": "584ec02dacbd274539b4ab16",
"people": "5bf60a4dfdb0ed18594b8ce6",
"people_no": "",
"ou_name": "33总经办",
"ou": "5858a50bdc2a25120dcf5163",
"time_point": "2019-02-20T00:00:00.000Z",
"create_people": "585a17ae2098688d02eeade7",
"type": "cus",
"eveid": "5c6a979b1a921a16cc592fab",
"title": "098765432dd1",
"description": "",
"terminated": false,
"activate": true,
"block_reason": "",
"block": false,
"validTo": "9999-12-31T15:59:59.999Z",
"validFrom": "2019-02-17T16:00:00.000Z",
"img": [
"5c6a97221a921a16cc592fa5"
],
"__v":
},
{
"_id": "5c6a97271a921a16cc592fa9",
"createDate": "2019-02-18T11:29:43.000Z",
"lastModified": "2019-02-18T11:29:43.810Z",
"client": "584ec02dacbd274539b4ab16",
"people": "5bf60a4dfdb0ed18594b8ce6",
"people_no": "",
"ou_name": "33总经办",
"ou": "5858a50bdc2a25120dcf5163",
"time_point": "2019-02-20T00:00:00.000Z",
"create_people": "585a17ae2098688d02eeade7",
"type": "cus",
"eveid": "5c6a97271a921a16cc592fa8",
"title": "098765432dd1",
"description": "",
"terminated": false,
"activate": true,
"block_reason": "",
"block": false,
"validTo": "9999-12-31T15:59:59.999Z",
"validFrom": "2019-02-17T16:00:00.000Z",
"img": [
"5c6a97221a921a16cc592fa5"
],
"__v":
}
]
}

选取部分字段,将"$$ROOT"换成下面想要的字段即可

$push: {"_id": "$_id", "process_code": "$process_code","process_name":"$process_name","wf_type":"$wf_type","cus_approve_event":"$cus_approve_event"}
 

mongodb-模糊查询+聚合函数+连表查询+排序

在 mongodb中用的主要是$regex来实现模糊查询

$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
$limit:用来限制MongoDB聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  例:table1:
{_id:,result:[
{name:"a",age:""},
{name:"b",age:""},
{name:"c",age:""}]
}
执行db.table1.aggregate({"$unwind":"$result"})后的结果为
{id:,result:{name:"a",age:""}},
{id:,result:{name:"b",age:""}},
{id:,result:{name:"c",age:""}}
$group:将集合中的文档分组,可用于统计结果。 $sort:将输入文档排序后输出。 $geoNear:输出接近某一地理位置的有序文档。

聚合aggregate 管道运算符(全)

$setIntersection: 是取两个数组的交集

isShow: { $setIntersection: [ "$positions", current_positions ] }

实用注意事项记录:

ProcessDefine.aggregate({
$match: {process_code: 'CustomizeAttendance', block: false, client: ObjectId(client)}
},{
$lookup: { //lookup连表查询后都是数组,就算原来的结构是对象的连表后查出的结构也是数据
from: 'cusitemapproveevents', // 数据库中的表名(全部小写,默认加s)
localField: 'cus_approve_event',
foreignField: '_id',
as: 'cus_approve_event',
}
},{
$unwind:{ // 将数组结构换为对象结构
path: '$cus_approve_event',
preserveNullAndEmptyArrays:true
}
},
{
$group:{
_id: {cus_approve_event:"$cus_approve_event._id", approve_name: "$cus_approve_event.approve_name"}, //分组,一个值的分组_id:"$cus_approve_event._id", 对两个值进行分组,传对象。
       count:{ $sum: 1},
       result:{
        // $push: "$$ROOT" // 全部字段
        $push: {"_id": "$_id", "process_code": "$process_code","process_name":"$process_name","wf_type":"$wf_type","cus_approve_event":"$cus_approve_event"} } } // 只选需要的字段
  }).exec(function(err,data){
    res.json(data);
   })
}

  

 

aggregate基础 使用记录的更多相关文章

  1. C#基础知识记录一

    C#基础知识记录一 static void Main(string[] args) { #region 合并运算符的使用(合并运算符??) 更多运算符请参考:https://msdn.microsof ...

  2. DataBase MongoDB基础知识记录

    MongoDB基础知识记录 一.概念: 讲mongdb就必须提一下nosql,因为mongdb是nosql的代表作: NoSQL(Not Only SQL ),意即“不仅仅是SQL” ,指的是非关系型 ...

  3. MarkDown基础语法记录

    基础语法记录,其中有一些博客园暂不支持 <!--标题--> # 一级标题 # ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 一级标题 ...

  4. MongoDB基础知识记录

    MongoDB基础知识记录 一.概念: 讲mongdb就必须提一下nosql,因为mongdb是nosql的代表作: NoSQL(Not Only SQL ),意即“不仅仅是SQL” ,指的是非关系型 ...

  5. MVC+Ext.net零基础学习记录(五)

    继MVC+Ext.net零基础学习记录(四),在后面我在既有的项目上又添加了一个子项目,还用前面提到的方法,进行主项目中引用DLL,然后子项目中生成事件中使用mkdir 进行拷贝 发现一个下午就总是报 ...

  6. MVC+Ext.net零基础学习记录(四)

    在上一篇文章[MVC+Ext.net零基础学习记录(三)]中提到了利用MVC的Area可以做到项目分离,但是实际操作起来还是有很多问题的.比如,对于物理资源的访问,会报:没有相关资源 开始的时候,我在 ...

  7. java基础复习记录

    java基础复习记录(数组.对象.异常) 数组 数组的定义 数组是相同类型数据的有序集合.如:篮球队就是一个数组,队员球服上有号码,相当于索引.通过某一个的某一个号码来确认是某一个队员.数组中索引从0 ...

  8. 【JSP】JSP基础学习记录(四)—— Servlet

    序: 众所周知JSP的基础也就是Servlet,如果单纯用Servlet类来响应用户的HTTP请求可以吗?答案是肯定的.JSP中的9个内置对象只是自动帮我们初始化的,没有他们一样可以实现web.只是工 ...

  9. LNMP系列网站零基础开发记录(一)

    [目录] 扯淡吹逼之开发前奏 Django 开发环境搭建及配置 web 页面开发 Django app开发 Django 站点管理 Python 简易爬虫开发 Nginx&uWSGI 服务器配 ...

随机推荐

  1. Simple Factory Pattern

    Question: How do you achieve the functions of calculator by Object-Oriented ? Analysis: 1,The functi ...

  2. Linux的DNS配置2-主从服务器

    1.实验背景 之前写了Linux的DNS配置1-DNS入门,其中只用了一台DNS服务器,但一般在大型网络中,都要通过配置辅助DNS服务器可以提高DNS服务的可靠性,本次实验即配置DNS主从服务器 2. ...

  3. 利用phpspider爬取网站数据

    本文实例原址:PHPspider爬虫10分钟快速教程 在我们的工作中可能会涉及到要到其它网站去进行数据爬取的情况,我们这里使用phpspider这个插件来进行功能实现. 1.首先,我们需要php环境, ...

  4. Hadoop2-HDFS学习笔记之入门(不含YARN及MR的调度功能)

    架构 Hadoop整体由HDFS.YARN.MapReduce三大部分组成,推荐架构参考:https://www.cnblogs.com/zhjh256/p/10573684.html. 注:2.x的 ...

  5. Linux内核源码分析 day01——内存寻址

    前言 Linux内核源码分析 Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识. 自制Antz操作系统 一个自制的操作系统,Antz .半图形化半命令式系统,同时嵌入 ...

  6. 施密特正交化 GramSchmidt

    施密特正交化 GramSchmidt 施密特正交化的原名是 Gram–Schmidt process,是由Gram和schmidt两个人一起发明的,但是后来因为施密特名气更大,所以该方法被简记为施密特 ...

  7. mysql 数据备份和还原

    使用mysqldump命令备份 使用root用户备份test数据库下的person表 mysqldump -u root -p test person > D:\backup.sql 备份多个数 ...

  8. 使用Java SDK实现离线签名

    严格来说,tx-signer并不属于SDK,它是bytomd中构建交易.对交易签名两大模块的java实现版.因此,若想用tx-signer对交易进行离线签名,需要由你在本地保管好自己的私钥. 如果你的 ...

  9. Hive 导入 parquet 格式数据(未完,待续)

    Hive 导入 parquet 格式数据 Parquet 格式文件,查看Schema Parquet 之mapreduce Hive 导入 parquet 格式数据

  10. 我的第一篇博客。(JavaScript的声明和数据类型的一些笔记)

    这是我的第一篇博客,务必请大家多多关照. 下面是前端js的变量和数据类型的一些笔记,不是很全请多多包涵. 1.变量 变量的声明 var 变量名 变量这个容器中放的是数据 变量的赋值 变量名 = 数据 ...