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
更新链接