【问题标题】:How to specify a key function for group aggregation如何为组聚合指定键函数
【发布时间】:2013-03-18 12:14:49
【问题描述】:

我想通过UserAgent聚合:

db.reports.aggregate(
    {
        $group: {
            _id: '$UserAgent',
            docsPerUserAgent: {
                $sum : 1
            }
        }
    }
)

上面的查询将考虑到 整个 UserAgent 字符串。我想做的是计算包含 Android(选项 A)、iPhone/iPad(选项 B)和其余(选项 C)的那些。如何将 keyf 函数提供给聚合框架(类似于此 - How to group by specifying a function to fetch a key? 但在聚合框架的上下文中)?

【问题讨论】:

  • 目前,除了 substr 之外,没有用于将一段字符串分组的投影,它不会满足您的需求。通常,最好的方法是将用户代理存储在您需要分组的部分中
  • 如果是这样,为什么不将其作为答案分享(我会批准)?
  • 如果您提供了一个示例文档,它可能有助于提出实现相同目标的不同方法。
  • UserAgent 是一个可能包含 AndroidiPhone*/*iPad 等的字段。我想 group by 使用它投影。

标签: mongodb aggregation-framework


【解决方案1】:

目前没有什么可以让你做类似的事情:

db.col.aggregate([
    {$project: {userAgentType: {$extract: /(Android|iPhone/iPad)/}}},
    {$group: on_userAgentType}
]);

也许 JIRA 中已经存在此功能,但是我无法立即找到它。

最好的方法是将用户代理字符串的“有趣”部分拆分为单独的字段,以便您可以按userAgent.agentType 之类的内容进行分组,代表androidipadiphone。不仅如此,您还可以使用它预先生成$match,这意味着您可以在该字段上使用索引,从而使您的聚合总体上具有更高的性能。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-10-18
  • 2014-12-08
  • 1970-01-01
  • 2019-12-08
  • 2016-12-06
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
相关资源
最近更新 更多