我们可以在 Switch 上创建索引吗?MongoDB 中的案例
Posted
技术标签:
【中文标题】我们可以在 Switch 上创建索引吗?MongoDB 中的案例【英文标题】:Can we create an index on a Switch... Case in MongoDB 【发布时间】:2019-12-22 04:34:46 【问题描述】:我有一个巨大的收藏。我正在使用match
对我通过CASE
语句设置的值进行过滤。我可以在该文本值上创建索引吗?
这是我的查询:
db.col.aggregate([
'$match':
'date':
'$gte': '2019-07-15',
'$lte': '2019-08-14'
,
'xyz': 'abc'
,
,
'$group':
'_id':
'b_version': '$b',
'b_main':
'$switch':
'branches': [
'case': '$gt': ['$indexOfCP': ['$b', "Google Plus"] ,-1], 'then': 'GP' ,
'case': '$gt': ['$indexOfCP': ['$b', "Facebook"] ,-1], 'then': 'FB' ,
'case': '$gt': ['$indexOfCP': ['$b', "Instagram"] ,-1], 'then': 'IG' ,
'case': '$gt': ['$indexOfCP': ['$b', "Snapchat"] ,-1], 'then': 'SC' ,
],
'default': 'Other'
,
,
'b_ct': '$sum': 1,
'starts': '$sum': '$starts',
'completes': '$sum': '$completes'
,
'$project':
'_id': 0,
'b_version': '$_id.b_version',
'b_main': '$_id.b_main',
'b_ct': '$b_ct',
'starts': '$starts',
'completes': '$completes',
, '$match': 'b_main': 'SC',
'$sort': 'b_main': 1, 'b_version': 1,
])
我想在b_main
上设置一个index
。有没有办法做到这一点?我其实想把它设置在date, xyz and a text match on b_main
有可能吗?
【问题讨论】:
【参考方案1】:无法直接索引$switch
案例。
聚合框架操作对索引的使用在here 中进行了描述。最重要的是:
$match 和 $sort 管道运算符可以利用索引 当它们发生在管道的开始时。
$group
阶段不会被直接索引,但您可以重新设计您的操作以提高效率,无论是在以下方面:
确保对传递给 $group 的数据的初始检索得到有效索引,或者..
减少传递到 $group 阶段的不必要数据量
查看您的操作,您似乎只对b_version
包含Snapchat
的文档感兴趣。与其将所有文档传递给$group
并在最后过滤掉不必要的文档,不如考虑在b_version
上添加一个过滤器到初始$match
阶段,以减少进入管道的文档数量。
初始的$match
阶段将能够使用索引: xyz: 1, b_version: 1, date: 1
。
【讨论】:
太棒了!谢谢! 当我必须过滤“其他”时,问题就来了以上是关于我们可以在 Switch 上创建索引吗?MongoDB 中的案例的主要内容,如果未能解决你的问题,请参考以下文章