如何指定组聚集

问题描述:

的一个关键功能,我想通过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?但是在聚合框架的上下文中)?

+1

目前没有任何一个字符串的组合,除了substr不会做你想找的投影。通常情况下,最好的方法是将用户代理存储在 – Sammaye 2013-03-18 14:08:33

+0

中需要分组的组件上,为什么不将它作为答案分享(我会批准它)? – BreakPhreak 2013-03-18 14:11:05

+0

如果您提供了一个示例文档,它可能有助于提供实现相同内容的不同方式。 – 2013-03-18 16:31:31

目前没有什么可以让你做服用点,如:

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

也许这个功能在JIRA中已经存在但是,我不能马上找到它。

而不是对的更好的方法来做到这将是分裂出去的用户代理字符串的“有趣”的部分为独立的字段,以便您可以通过类似userAgent.agentType代表组会androidipadiphone。不仅如此,您还可以使用它来预先生成$match,这意味着您可以在此字段上使用索引,从而使您的聚合通常具有更高的性能。

+0

只有一个问题:你在评论中提到的'substr'是什么? – BreakPhreak 2013-03-18 14:20:10

+1

@BreakPhreak http://docs.mongodb.org/manual/reference/aggregation/#_S_substr允许你基本上像'PHP'等大多数语言一样做'substr',因此你可以通过跳过来分割文档的一个字段,例如说,值的第一个字符,然后停止3个字符,即在PHP'substr('hello world',1,3)'将返回'ello' – Sammaye 2013-03-18 14:23:25

+0

更新的链接为substr函数文档https:// docs.mongodb.com/manual/reference/operator/aggregation/substr/ – avck 2016-09-06 10:04:14