mongodb简化了分组结果

时间:2017-04-21 16:01:29

标签: mongodb

我有一个使用以下模式记录pto条目的mongodb集合:

[
  {
    "_id": {
      "$oid": "58e2b888c97157e9aca48361"
    },
    "pto_date": "11/07/2017",
    "pto_type": "Sick / Personal",
    "pto_duration": 3,
    "pto_user": "amanda@push10.com",
    "pto_approved": "false"
  },
  {
    "_id": {
      "$oid": "58e2b90fc97157e9aca48362"
    },
    "pto_date": "02/03/2017",
    "pto_type": "Vacation",
    "pto_duration": 2,
    "pto_user": "amanda@push10.com",
    "pto_approved": "true"
  },
  {
    "_id": {
      "$oid": "58e3c91ac2397604bf40ff0a"
    },
    "pto_date": "04/04/2017",
    "pto_type": "Sick / Personal",
    "pto_duration": 5,
    "pto_user": "amanda@push10.com",
    "pto_approved": "true"
  },
  {
    "_id": {
      "$oid": "58fa1e4c382e17705cd723d5"
    },
    "pto_date": "04/21/2017",
    "pto_type": "Sick / Personal",
    "pto_duration": 2,
    "pto_user": "amanda@push10.com",
    "pto_approved": "true"
  },
  {
    "_id": {
      "$oid": "58fa1e80382e17705cd723d6"
    },
    "pto_date": "04/21/2017",
    "pto_type": "Sick / Personal",
    "pto_duration": 2,
    "pto_user": "greg@push10.com",
    "pto_approved": "false"
  }
]

使用以下聚合管道,我可以获得与按批准状态分组的特定用户匹配的所有条目,以及总计小时数。

db.pto.aggregate([
    { 
        $match: { 
            pto_user : "amanda@push10.com" 
        } 
    },
    { 
        $group: { 
            _id : "$pto_approved", 
            total : { 
                $sum : "$pto_duration" 
            } 
        } 
    }
])

我的结果如下:

[
    { "_id" : "true", "total" : 9 }
    { "_id" : "false", "total" : 3 }
]

我的目标是进一步简化这些结果:

{ "approved" : 9, "pending" : 3 }

我不确定是否还有一个额外的步骤可以添加到我的管道中以实现此功能,或者我是否正在接近此错误。

1 个答案:

答案 0 :(得分:0)

MongoDB 3.4,shell

db.your_col.aggregate([
    {$match: {pto_user: "amanda@push10.com"}},
    {$group: {_id: null,
              approved: {$sum: {$cond: [{$eq: ['$pto_approved', 'true']}, '$pto_duration', 0]}},
              pending: {$sum: {$cond: [{$eq: ['$pto_approved', 'false']}, '$pto_duration', 0]}}}},
    {$project: {_id: 0}}])
顺便说一句,如果将'false'/'true'存储为布尔值并将pto_date存储为Date对象

会更好