微信小程序聚合查询笔记

175 阅读1分钟
const db = cloud.database();
const _ = db.command;
const $ = db.command.aggregate;


 .match({})  //筛选出匹配以外的数据
 .sort({})  //排序  -1 为降序(从大到小)  1  为正序(从小到大)
 .group({}) // 分组
 .project({})//聚合阶段。把指定的字段传递给下一个流水线,指定的字段可以是某个已经存在的字段,也可以是计算出来的新字段。
 .lookup({}) //左关联
 .replaceRoot({})  //聚合阶段。指定一个已有字段作为输出的根节点,也可以指定一个计算出的新字段作为根节点
 .skip({}) // 跳过指定的数量的文档
 .limit({})  //限制输出到下一步文档的数量
 .end()  //结束


match({
	 indep: _.elemMatch({     //indep为查询输出的其中的某一个元素   _.elemMatch为筛选出数组的某一项的方法
    exceptions: _.neq([])		// 'exceptions' 不为空的数据
                           })
})


match({
 org: _.elemMatch({   				//indep为查询输出的其中的某一个元素  _.elemMatch为筛选出数组的某一项的方法
path: db.RegExp({			//path 要筛选的数组中的元素   db.RegExp({})  为正则
 regexp: searchOrgReg,			//正则条件
 options: 'i',				//全局
                    })
                })
})




group({					
	  _id: "$_openid",			//   _id: 自定义的数组(数据)元素  "$_openid" 是从原数据中取的值
          ireport_data: $.push("$$ROOT")	//  ireport_data: 自定义的数组(数据)元素  $.push("$$ROOT")  是给把当前符合条件的分组添加到当前流水线阶段
})

replaceRoot({
	newRoot: $.mergeObjects([$.arrayElemAt(['$user', 0]), '$$ROOT'])     // $.mergeObjects({})  // 将多个文档合并为一个文档  $.arrayElemAt({})  // 将指定下标的数组项取出    //'$$ROOT' 代表空
})


project({
	 indep: $.slice(['$ireport_data', 1])						//聚合阶段  indep: 数据中的某一个元素  $.slice(['$ireport_data', 1])	把'$ireport_data'的数组截取下标为1个 ,并返回
})



 project({
        name: 1,			//保留name的元素
		phone:0,			//不要phone的元素
        unit:$.arrayElemAt(['$org.name', 0]), //取出'$org'这个对象中的'name'的第0个元素
        exceptions: $.filter({        //筛选   //exceptions:聚合阶段中当前流水线中的某个元素
        input: '$exceptions',		//  '$exceptions' 要筛选的数组
        as: 'item',				//表示数组各个元素的变量
        cond: $.eq(['$$item', '发热'])	//条件   查询 当前数组项item 等于'发热'的数组项
                })
            })


			 let searchOrgReg = '(^' + orgPath + '$)|(^' + orgPath + ',)';  查询的正则表达式
			 let searchCtn="";  //查询条件
			db.collection('ff_indep_report')
            .aggregate()
            .match({
                is_delete: false    //筛选已经'删除'的数据
            })
            .sort({ //按录入时间倒序排列
                created_time: -1
            })
            .group({ // 按openid 分组,同一个人可以录入多个
                _id: "$_openid",
                ireport_data: $.push("$$ROOT")
            })
            .project({ // 取出分组最前面一条记录
                indep: $.slice(['$ireport_data', 1])
            })
            .match({   //筛选掉exceptions为空数组的
                indep: _.elemMatch({
                    exceptions: _.neq([])
                })
            })
            .lookup({ // 左关联人员列表
                from: 'ff_user',
                localField: '_id',
                foreignField: '_openid',
                as: 'user'
            })
            .replaceRoot({ // 合并 user 集合到 ROOT 里面
                newRoot: $.mergeObjects([$.arrayElemAt(['$user', 0]), '$$ROOT'])
            })
            .project({ //把 左关联的集合 user 隐藏了
                user: 0
            })
            .lookup({ // 左关联单位集合
                from: 'ff_org',
                localField: 'org_id',
                foreignField: 'id',
                as: 'org'
            })
            .match({ // 匹配出 orgPath 单位和下级所有单位的人员
                    org: _.elemMatch({
                        path: db.RegExp({
                            regexp: searchOrgReg,
                            options: 'i',
                        })
                    })
            })
            .replaceRoot({ // 合并 indep 集合到 ROOT 里面
                newRoot: $.mergeObjects([$.arrayElemAt(['$indep', 0]), '$$ROOT'])
            })
            .project({
                name: 1,
                unit:$.arrayElemAt(['$org.name', 0]),
                exceptions: $.filter({     //筛选出包含异常的数据
                    input: '$exceptions',
                    as: 'item',
                    cond: $.eq(['$$item', searchCtn])
                })
            })
            .match({
                exceptions: _.neq([])
            })
            .skip(offset)
            .limit(limit)
            .end()