【问题标题】:Can we create an index on a Switch... Case in MongoDB我们可以在 Switch 上创建索引吗?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

有可能吗?

【问题讨论】:

    标签: mongodb indexing switch-statement match pymongo


    【解决方案1】:

    无法直接索引$switch 案例。

    聚合框架操作对索引的使用在here 中进行了描述。最重要的是:

    $match 和 $sort 管道运算符可以利用索引 当它们发生在管道的开始时。

    $group 阶段不会被直接索引,但您可以重新设计您的操作以提高效率,无论是在以下方面:

    • 确保对传递给 $group 的数据的初始检索得到有效索引,或者..

    • 减少传递到 $group 阶段的不必要数据量

    查看您的操作,您似乎只对b_version 包含Snapchat 的文档感兴趣。与其将所有文档传递给$group 并在最后过滤掉不必要的文档,不如考虑在b_version 上添加一个过滤器到初始$match 阶段,以减少进入管道的文档数量。

    初始的$match 阶段将能够使用索引:{ xyz: 1, b_version: 1, date: 1 }

    【讨论】:

    • 太棒了!谢谢!
    • 当我必须过滤“其他”时,问题就来了
    猜你喜欢
    • 2018-10-22
    • 2014-09-14
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多