【问题标题】:Get count on several fields using mongoose aggregation使用 mongoose 聚合获取多个字段的计数
【发布时间】:2021-09-17 04:34:51
【问题描述】:

我的 MongoDB employeeemployeeData 中有两个集合,我需要从 DB 获取一些静态信息。

  1. 未删除的员工总数。
  2. 拥有安全访问权限且未被删除的员工总数。
  3. 仍然活跃的员工总数;

这是我的Employee 收藏示例文档

{
 _id:'5ec25e74d028af28343f1061'
 isDeleted:false
 securityAccess:true
 details:'60475b7a93ac45d64a5957b0'
}

这是EmployeeData收藏文档

{
  _id:'60475b7a93ac45d64a5957b0'
  emplyeeId:'5ec25e74d028af28343f1061'
  isActive:'active',
  salary:225543.00,
  department:'sales'
}

我需要使用某种聚合从一个查询中获取这些数据,但我对 MongoDB 查询不太熟悉。

预期的结果如下所示。

Total Employees | Active Employees | Security Access
         10            5                    2

【问题讨论】:

    标签: mongodb mongoose aggregation-framework


    【解决方案1】:
    • $match 检查isDeleted 条件
    • $lookupEmployeeData
    • $group 为空
      • 获取员工总数,
      • 如果securityAccess 为真,则计算总安全访问权限
      • 如果isActive 为“活跃”,则计算活跃员工总数
    db.Employee.aggregate([
      { $match: { isDeleted: false } },
      {
        $lookup: {
          from: "EmployeeData",
          localField: "_id",
          foreignField: "emplyeeId",
          as: "activeEmployees"
        }
      },
      {
        $group: {
          _id: null,
          totalEmployees: { $sum: 1 },
          securityAccess: {
            $sum: {
              $cond: ["$securityAccess", 1, 0]
            }
          },
          activeEmployees: {
            $sum: {
              $cond: [
                { $eq: [{ $first: "$activeEmployees.isActive" }, "active"] },
                1,
                0
              ]
            }
          }
        }
      }
    ])
    

    Playground

    【讨论】:

    • @turvishal 我在我的 EmployeeData 中犯了一个错误isActive 是一个不是布尔值的字符串。它是activeinActive。我更改了这样的查询$cond: [{ isActive:['$eq','Active']}, 1, 0],但它不起作用。更新我的问题,很抱歉给您带来不便。
    猜你喜欢
    • 2019-03-30
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2017-01-20
    • 2017-04-26
    相关资源
    最近更新 更多