Administrator
Administrator
发布于 2025-04-06 / 472 阅读
35
0

mongoose聚合管道aggregate

💡 聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能。

语法格式:db.集合名称.aggregate({管道:{表达式}})

常用管道

$group

将集合中的⽂档分组, 可⽤于统计结果

$match

过滤数据, 只输出符合条件的⽂档

$project

修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果

$sort

将输⼊⽂档排序后输出

$limit

限制聚合管道返回的⽂档数

$skip

跳过指定数量的⽂档, 并返回余下的⽂档

$unwind

将数组类型的字段进⾏拆分

常用表达式

$sum

计算总和, $sum:1 表示以⼀倍计数

$avg

计算平均值

$min

获取最⼩值

$max

获取最⼤值

$push

在结果⽂档中插⼊值到⼀个数组中

$first

根据资源⽂档的排序获取第⼀个⽂档数据

$last

根据资源⽂档的排序获取最后⼀个⽂档数据


const arrAttribute = await models.institutionAttributes.aggregate(
  [
    {
      $lookup:连表关键词,类似mysql中的left join 
      {
        from: "exhibition_institutions",//需要连接的表名
        localField: "_id",//本表需要关联的字段
        foreignField: "attribute",//被连接表需要关联的字段
        as: "institutionsData"//查询出的结果集别名
      }
    },
    {
      $match://条件筛选关键词,类似mysql中的where
      {
        _id: mongoose.Types.ObjectId(team),//指定条件,在这里我指定了id,
      }
    },
    {
      $project://指定查询字段的关键词
      {
        _id: 0,//由于会默认展示_id,在这里设置为0,不展示
        name: 1,//展示一个字段名称为name的字段
        "institutionsData._id": 1,//同上
        }
        },
        ]
);
//下面这一段可以忽略,只是对结果进行筛选
let arrAttributeSort = [];
for (let i = 0; i < arrAttribute.length; i++) {
  for (let j = 0; j < arrAttribute[i].institutionsData.length; j++) {
    arrAttributeSort.push(arrAttribute[i].institutionsData[j]._id);
  }
}
const signData = await models.exhibitionItem.aggregate(
  [
    {
      $lookup:
        {
          from: "signups",
          localField: "_id",
          foreignField: "exhibition_item",
          as: "signInstitutionsData"
        }
    },
    {
      $match:
        {
          "signInstitutionsData": { $ne: [] },//$ne:[]用来剔除结果集中的空数组
          from: { $gte: parseInt(from) },,//大于等于
          to: { $lte: parseInt(to) },//小于等于
          "signInstitutionsData.institutions.institution": { $in: arrAttributeSort }//$in是批量查询,[1,2,3,4,5]这种形式的数组可以直接进行查询
        }
    },
    {
      $project:
        {
          _id: 0,
          "signInstitutionsData.unit_name": 1,
          "signInstitutionsData.institutions": 1
        }
    }
  ]
);





评论