【问题标题】:Grouping and counting across documents?跨文档分组和计数?
【发布时间】:2016-07-21 15:51:19
【问题描述】:

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

{
  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 名称合并到一个文档中以及两者的计数。关于如何完成此任务的任何建议?

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    您应该使用$map 将您的文档分成两份,然后是$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
        }
    }
    ]
    

    【讨论】:

    • 哇——太棒了。我可能只是将其作为两个单独的查询来完成。与两个查询相比,这样做有好处吗?
    • 只是看起来很大,怪罪于 JS linter :) 你打算将它们合并到内存中?
    • 它实际上最终会出现在一个新的集合中,所以我打算运行一次以插入出发点,然后再运行一次以更新到达点
    • 您仍在通过网络发送大量数据。
    • 实际上并行查询在性能上会更好,尽管它会使用“两个”连接而不是一个,并且可以说在请求中发送的流量比更长的管道“更少”。当然这是一个“合并”,更多地取决于数据输出的大小。不错的尝试。不过,您过度使用了$project 阶段(坏事,因为每个阶段都是物理传递数据),并且不难弄清楚前两个阶段可以是一个。另一个 MongoDB 3.2 优化是 "f": [{ "type": "dep", "name": "$departure.name" },{ "type": "arr", "name": "$arrival.name" }]]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 2023-02-07
    • 1970-01-01
    • 2017-02-27
    相关资源
    最近更新 更多