【问题标题】:documentdb aggregate query not using index不使用索引的 documentdb 聚合查询
【发布时间】:2023-02-17 00:20:00
【问题描述】:

我试图在一个日期范围内找到一个值的最大值。我使用的聚合查询与索引列 _id 匹配。但是查询花费的时间太长,解释计划告诉我它正在进行 COLLSCAN 而不是索引扫描。你能建议为什么它不使用 _id 上的索引吗?

如果我在 colId 上创建另一个索引会有帮助吗?

    {$match:{_id:{ $regex: 'regex'}}},
    {$match:{$and:[{"colId":'DATA'}]}},
    {$unwind:"$data"},
    {$match:{$and:[{"data.time":{$gte:ISODate("xyz"),$lte:ISODate("zyx")}}]}},
    {$match:{$and: [{ "data.col": { $exists: true}}] }},
    {$group:{_id:"$data.time",maxCol:{$max:"$data.col"}}} ,
    {$sort:{"maxCol":-1,_id:-1}},
    {$limit:1}
    ])

解释计划sn-p:

                "winningPlan" : {
                        "stage" : "LIMIT_SKIP",
                        "inputStage" : {
                                "stage" : "SORT",
                                "sortPattern" : {
                                        "_id" : -1,
                                        "maxCol" : -1
                                },
                                "inputStage" : {
                                        "stage" : "SUBSCAN",
                                        "inputStage" : {
                                                "stage" : "HASH_AGGREGATE",
                                                "inputStage" : {
                                                        "stage" : "SUBSCAN",
                                                        "inputStage" : {
                                                                "stage" : "PROJECTION",
                                                                "inputStage" : {
                                                                        "stage" : "COLLSCAN"
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }

这是在 DocumentDB (mongo4)

【问题讨论】:

    标签: mongodb aws-documentdb


    【解决方案1】:

    我认为正则表达式不能使用索引。 $match 也适用于阵列,试试这个:

    db.collection.aggregate([
       {
          $match: {
             "colId": 'DATA',
             "data.time": { $gte: ISODate("xyz"), $lte: ISODate("zyx") },
             "data.col": { $exists: true }
          }
       },
       { $match: { _id: { $regex: 'regex' } } },
       { $unwind: "$data" },
       { $group: { _id: "$data.time", maxCol: { $max: "$data.col" } } },
       { $sort: { "maxCol": -1, _id: -1 } },
       { $limit: 1 }
    ])
    

    因此,将索引放在{colId: 1, "data.time": 1}{colId: 1, "data.time": 1, "data.col": 1}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      相关资源
      最近更新 更多