Mongodb 如何为组聚合指定键函数

Mongodb 如何为组聚合指定键函数,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我想通过UserAgent聚合: db.reports.aggregate( { $group: { _id: '$UserAgent', docsPerUserAgent: { $sum : 1 } } } ) 上面的查询将考虑整个UserAgent字符串。我想做的是计算那些包含Android(选项A)、iPhone/iPad(选项B)和其他

我想通过
UserAgent
聚合:

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

上面的查询将考虑整个
UserAgent
字符串。我想做的是计算那些包含Android(选项A)、iPhone/iPad(选项B)和其他(选项C)的。我如何向聚合框架提供
keyf
函数(类似于此,但在聚合框架的上下文中)?

目前,没有任何东西允许您执行以下操作:

db.col.aggregate([
    {$project: {userAgentType: {$extract: /(Android|iPhone/iPad)/}}},
    {$group: on_userAgentType}
]);
也许这个功能已经存在于JIRA中,但是我无法立即找到它


相反,更好的方法是将用户代理字符串的“有趣”部分拆分为单独的字段,这样您就可以按
userAgent.agentType
之类的内容进行分组,它表示
android
ipad
iphone
。不仅如此,您还可以使用它来生成一个
$match
,这意味着您可以在该字段上使用索引,从而使聚合总体上更高效。

目前,除了substr之外,没有将字符串片段分组的投影,substr不会满足您的要求。通常情况下,最好的方法是将用户代理存储在您需要分组的部分中。如果这样,为什么不将其作为答案共享(我会批准)?如果您提供了一个示例文档,它可能有助于建议实现相同目标的不同方法。
UserAgent
是一个可能包含Android、iPhone*/*iPad、,等等。我想使用该投影对
进行分组。只有一个问题:您在评论中提到的
substr
是什么?@BreakPhreak允许您基本上执行与
substr
在大多数语言(如PHP)中相同的操作,您可以通过跳过来拆分文档字段,例如,值的第一个字符并在以后停止3个字符,即在PHP中
substr('hello world',1,3)
将返回substr函数文档的
ello
更新链接