跨文档分组和计数?

时间:2016-04-01 18:12:14

标签: mongodb mongodb-query

我有一个包含类似于以下格式的文档的集合:

{
  departure:{name: "abe"},
  arrival:{name: "tom"}
},
{
  departure:{name: "bob"},
  arrival:{name: "abe"}
}

并获得如下输出:

{ 
  name: "abe",
  departureCount: 1,
  arrivalCount: 1
},
{
  name: "bob",
  departureCount: 1,
  arrivalCount: 0
},
{
  name: "tom",
  departureCount: 0,
  arrivalCount: 1
}

我可以通过查询特定数据来单独获取计数,如下所示:

db.sched.aggregate([
  {
    "$group":{
      _id: "$departure.name",
      departureCount: {$sum: 1}
    }
  }
])

但我还没弄明白如何将arrivaldeparture名称合并到一个文档中以及两者的计数。有关如何实现这一目标的任何建议吗?

1 个答案:

答案 0 :(得分:2)

您应该使用$map将文档拆分为2,然后$unwind$group ..

[
{
    $project: {
        dep: '$departure.name',
        arr: '$arrival.name'

    }
},

{
    $project: {
        f: {
            $map: {
                input: {
                    $literal: ['dep', 'arr']
                },
                as: 'el',
                in : {
                    type: '$$el',
                    name: {
                        $cond: [{
                            $eq: ['$$el', 'dep']
                        }, '$dep', '$arr']
                    }
                }
            }
        }
    }
},

{
    $unwind: '$f'
}, {
    $group: {
        _id: {
            'name': '$f.name'
        },
        departureCount: {
            $sum: {
                $cond: [{
                    $eq: ['$f.type', 'dep']
                }, 1, 0]
            }
        },
        arrivalCount: {
            $sum: {
                $cond: [{
                    $eq: ['$f.type', 'arr']
                }, 1, 0]
            }
        }
    }
}, {
    $project: {
        _id: 0,
        name: '$_id.name',
        departureCount: 1,
        arrivalCount: 1
    }
}
]