如何指定组聚集
的一个关键功能,我想通过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?但是在聚合框架的上下文中)?
目前没有什么可以让你做服用点,如:
db.col.aggregate([
{$project: {userAgentType: {$extract: /(Android|iPhone/iPad)/}}},
{$group: on_userAgentType}
]);
也许这个功能在JIRA中已经存在但是,我不能马上找到它。
而不是对的更好的方法来做到这将是分裂出去的用户代理字符串的“有趣”的部分为独立的字段,以便您可以通过类似userAgent.agentType
代表组会android
或ipad
或iphone
。不仅如此,您还可以使用它来预先生成$match
,这意味着您可以在此字段上使用索引,从而使您的聚合通常具有更高的性能。
只有一个问题:你在评论中提到的'substr'是什么? – BreakPhreak 2013-03-18 14:20:10
@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
更新的链接为substr函数文档https:// docs.mongodb.com/manual/reference/operator/aggregation/substr/ – avck 2016-09-06 10:04:14
目前没有任何一个字符串的组合,除了substr不会做你想找的投影。通常情况下,最好的方法是将用户代理存储在 – Sammaye 2013-03-18 14:08:33
中需要分组的组件上,为什么不将它作为答案分享(我会批准它)? – BreakPhreak 2013-03-18 14:11:05
如果您提供了一个示例文档,它可能有助于提供实现相同内容的不同方式。 – 2013-03-18 16:31:31