【问题标题】:Mongodb aggregation, group and then countMongodb聚合,分组然后计数
【发布时间】:2018-08-17 22:11:03
【问题描述】:

我有工作,候选人已经申请了每个工作。这是一份工作的示例。

  {
     "_id": ObjectId("5a9e625c748a563a80e5d86a"),
     "job_title": "Software developer",
     "companyId": ObjectId("5a9e625c748a563a80e5889ds")
     "applications" : [ 
            {
                "applied" : true,
                "shortlisted" : false,
                "interviewed" : false,
                "offered" : false,
                "hired" : false,
                "rejected" : false
            },
            {
                "applied" : true,
                "shortlisted" : true,
                "interviewed" : false,
                "offered" : false,
                "hired" : false,
                "rejected" : false
            },
            {
                "applied" : true,
                "shortlisted" : true,
                "interviewed" : true,
                "offered" : false,
                "hired" : false,
                "rejected" : false
            },
            {
                "applied" : true,
                "shortlisted" : true,
                "interviewed" : true,
                "offered" : false,
                "hired" : false,
                "rejected" : false
            },
            {
                "applied" : true,
                "shortlisted" : true,
                "interviewed" : false,
                "offered" : false,
                "hired" : false,
                "rejected" : true
            },

        ]

    }

候选人可以经历申请、入围、面试......

所以我想得到的是每个阶段的申请人总数。

结果是这样的:

{
  applied: 1,
  shortlisted: 1,
  interviewed: 2,
  offered: 0,
  hired: 0,
  rejected: 1
}

这是我尝试编写查询的方式

  Job.aggregate([
    {
      $match: {
        companyId : mongoose.Types.ObjectId(req.params.id),
        active: true
      }
    },
    {
        $unwind: "$applications"
    },
    {
      $replaceRoot : {
        newRoot : "$applications"
      }
    },
    {
      $group: {
          _id : {
            applied : "$applied",
            shortlisted : "$shortlisted",
            interviewed : "$interviewed",
            offered : "$offered",
            hired : "$hired",
            rejected : "$rejected"
          },
          applied: {$sum: "_id"},
          // shortlisted: {$sum: "shortlisted"},
          // interviewed: {$sum: "interviewed"},
          // offered: {$sum: "offered"},
          // hired: {$sum: "hired"},
          // rejected: {$sum: "rejected"},
      }
    }
  ])

这是针对不考虑工作的总计数。我还想知道每个工作阶段的申请人数。

已编辑:

{
            "applied" : true,
            "shortlisted" : false,
            "interviewed" : false,
            "offered" : false,
            "hired" : false,
            "rejected" : false,
            "rejectedComment" : "",
            "notes" : [],
            "documents" : [],
            "assessment" : [],
            "interviewSchedule" : [],
            "references" : [],
            "_id" : ObjectId("5a9fc2b6e80e10405ce612d6"),
            "talentId" : ObjectId("5a8e7da63925a10b68ea08dd"),
            "createdAt" : ISODate("2018-03-07T10:45:10.675Z"),
            "updatedAt" : ISODate("2018-03-07T10:45:10.675Z")
        }

更新

{
      $match: {
        companyId : mongoose.Types.ObjectId(req.params.id),
        active: true
      }
    },
    {
        $unwind: "$applications"
    },
    {
      $replaceRoot : {
        newRoot : "$applications"
      }
    },
    {
      $group: {
          _id : '',
          // "applied":{"$sum":{"$cond":{$and:[{$eq:["$applications", {applied: true, shortlisted: false , interviewed: false, offered: false, hired: false, rejected: false}]},1,0]}}},
          "applied": {"$sum": {"$cond": {$and: [{$eq:["$applications", {applied: true, shortlisted: false , interviewed: false, offered: false, hired: false, rejected: false}]},1,0]}]}}
          //   shortlisted : {"$applied.shortlisted" : false},
          //   interviewed : {"$applied.interviewed" : false},
          //   offered : {"$applied.offered" : false},
          //   hired : {"$applied.hired" : false},
          // "rejected":{"$sum":{"$cond":[{$eq:["$applications", {rejected: true}]},1,0]}},
          // },
          // "applied": {
          //   "$sum": 1
          // }
        // }
      }
    }

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您可以尝试$sum 中的$cond 运算符来统计每个阶段的应用程序。

    类似

    Jobs.aggegate([
      {"$match":{"companyId":mongoose.Types.ObjectId(req.params.id),"active":true}},
      {"$unwind":"$applications"},
      {"$group":{
        "_id": some group key,
        "applied":{"$sum":{"$cond":["$applied",1,0]}}
        ...other stages
      }
    ])
    

    【讨论】:

    • 感谢 veeram 的回复,我其实是 mongodb 的新手。你能告诉我 $cond 中的 1、0 和一些组键是什么吗?为什么我需要那个。谢谢
    • 没问题。你的组键是什么?工作 ID/公司 ID 对吗? 1, 0 是在 stage 为 true 时输出 1,否则在 false 时输出 0, $sum 用于计算组 id 中的特定 stage。
    • {applied: true, shotlisted: false, other aslo false .....}, {applied: true, shotlisted: true, other false.....}, {applied: true,拍摄清单:真实,采访:真实和其他虚假.....}。
    • 对不起,我没有关注你。你有什么具体问题吗?
    • 我必须按 {applied: true, shotlisted: false , other aslo false .....}, {applied: true, shotlisted: true , other false .....}, {应用:真实,清单:真实,采访:真实和其他虚假.....}。这些基本上是申请人在单一工作中提出的申请。所以我需要确定有多少候选人处于申请阶段,入围阶段,面试阶段......和拒绝阶段。 $cond 有道理,但我不知道怎么写
    【解决方案2】:

    您可以尝试不使用 $unwind$group 使用 $reduce$conditional $sum

    db.jobs.aggregate([
        //{$match : {}},
        {$project : {
            data : {
                $reduce : {
                    input : "$applications",
                    initialValue : {
                        "applied" : 0,
                        "shortlisted" : 0,
                        "interviewed" : 0,
                        "offered" : 0,
                        "hired" : 0,
                        "rejected" : 0
                    },
                    in : {
                        "applied" : {$sum : ["$$value.applied", {$cond : ["$$this.applied", 1, 0]}]},
                        "shortlisted" : {$sum : ["$$value.shortlisted", {$cond : ["$$this.shortlisted", 1, 0]}]},
                        "interviewed" : {$sum : ["$$value.interviewed", {$cond : ["$$this.interviewed", 1, 0]}]},
                        "offered" : {$sum : ["$$value.offered", {$cond : ["$$this.offered", 1, 0]}]},
                        "hired" : {$sum : ["$$value.hired", {$cond : ["$$this.hired", 1, 0]}]},
                        "rejected" : {$sum : ["$$value.rejected", {$cond : ["$$this.rejected", 1, 0]}]}
                    }
                }
            }
        }},
        {$replaceRoot : {newRoot : "$data"}}
    ]).pretty()
    

    结果

    {
        "applied" : 5,
        "shortlisted" : 4,
        "interviewed" : 2,
        "offered" : 0,
        "hired" : 0,
        "rejected" : 1
    }
    > 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 2013-11-23
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多