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()