我们可以在 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 中的案例的主要内容,如果未能解决你的问题,请参考以下文章

mongo: 索引

Spring Data Mongo @Indexed 多次创建索引

mongo 正在使用键/值 null 自动创建索引

我们可以在 MS 访问数据库上创建多列唯一索引吗?

对象数组与对象上的 Mongo 索引

在 MongoDB 中,如果删除了集合,索引也会自动删除吗?