Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-62459

Timeseries collection with collation doesn't set bounds on Collscan when looking up by time field

    • Type: Icon: Bug Bug
    • Resolution: Works as Designed
    • Priority: Icon: Major - P3 Major - P3
    • None
    • Affects Version/s: None
    • Component/s: None
    • Labels:
    • ALL
    • Hide
      db.weather.drop();      
      db.createCollection(
          "weather",
          {
             timeseries: {
                timeField: "timestamp",
                metaField: "metadata",
                granularity: "seconds"
             }, 
             collation: {locale: "en", strength: 2}
          }
      );
      db.weather.find({
         "timestamp": ISODate("2021-05-18T01:00:00.000Z")
      }).explain()
      
      Show
      db.weather.drop(); db.createCollection( "weather", { timeseries: { timeField: "timestamp", metaField: "metadata", granularity: "seconds" }, collation: {locale: "en", strength: 2} } ); db.weather.find({ "timestamp": ISODate("2021-05-18T01:00:00.000Z") }).explain()
    • Execution Team 2022-01-24

      While working on SERVER-61260 I’ve noticed lookups by the time field on timeseries collections that have a collation don’t set bounds for the COLLSCAN, example:

      db.weather.drop();      
      db.createCollection(
          "weather",
          {
             timeseries: {
                timeField: "timestamp",
                metaField: "metadata",
                granularity: "seconds"
             }, 
             collation: {locale: "en", strength: 2}}
          }
      );
      db.weather.find({
         "timestamp": ISODate("2021-05-18T01:00:00.000Z")
      }).explain()
      {
              "explainVersion" : "2",
              "queryPlanner" : {
                      "namespace" : "test.weather",
                      "indexFilterSet" : false,
                      "parsedQuery" : {
                              "timestamp" : {
                                      "$eq" : ISODate("2021-05-18T01:00:00Z")
                              }
                      },
                      "queryHash" : "911AD713",
                      "planCacheKey" : "911AD713",
                      "maxIndexedOrSolutionsReached" : false,
                      "maxIndexedAndSolutionsReached" : false,
                      "maxScansToExplodeReached" : false,
                      "winningPlan" : {
                              "queryPlan" : {
                                      "stage" : "COLLSCAN",
                                      "planNodeId" : 1,
                                      "filter" : {
                                              "timestamp" : {
                                                      "$eq" : ISODate("2021-05-18T01:00:00Z")
                                              }
                                      },
                                      "direction" : "forward"
                              },
                              "slotBasedPlan" : {
                                      "slots" : "$$RESULT=s5 $$RID=s6 env: { s3 = Timestamp(1641804498, 4) (CLUSTER_TIME), s1 = TimeZoneDatabase(Asia/Kuching...Australia/Perth) (timeZoneDB), s2 = Nothing (SEARCH_META), s4 = 1641804499092 (NOW) }",
                                      "stages" : "[1] filter {fillEmpty (s9, false)} \n[1] traverse s9 s8 s7 [s5, s6] {s9 || s8} {s9} \nfrom \n    [1] project [s7 = getField (s5, \"timestamp\")] \n    [1] scan s5 s6 none none none none [] @\"cf1687e2-56d2-4971-b19e-ec89d2391f73\" true false \nin \n    [1] project [s8 = fillEmpty (s7 == 1621299600000, false)] \n    [1] limit 1 \n    [1] coscan \n"
                              }
                      },
                      "rejectedPlans" : [ ]
              },
              "command" : {
                      "find" : "weather",
                      "filter" : {
                              "timestamp" : ISODate("2021-05-18T01:00:00Z")
                      },
                      "$db" : "test"
              },
              "serverInfo" : {
                      "host" : "ip-10-122-10-220",
                      "port" : 27017,
                      "version" : "5.3.0-alpha-48-g06692bd",
                      "gitVersion" : "06692bdbfa912848a884c6440caab9cfb693e93c"
              },
              "serverParameters" : {
                      "internalQueryFacetBufferSizeBytes" : 104857600,
                      "internalQueryFacetMaxOutputDocSizeBytes" : 104857600,
                      "internalLookupStageIntermediateDocumentMaxSizeBytes" : 104857600,
                      "internalDocumentSourceGroupMaxMemoryBytes" : 104857600,
                      "internalQueryMaxBlockingSortMemoryUsageBytes" : 104857600,
                      "internalQueryProhibitBlockingMergeOnMongoS" : 0,
                      "internalQueryMaxAddToSetBytes" : 104857600,
                      "internalDocumentSourceSetWindowFieldsMaxMemoryBytes" : 104857600
              },
              "ok" : 1,
              "$clusterTime" : {
                      "clusterTime" : Timestamp(1641804498, 4),
                      "signature" : {
                              "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                              "keyId" : NumberLong(0)
                      }
              },
              "operationTime" : Timestamp(1641804498, 4)
      }
      

      If there's no collation the plan sets min/max bounds for the Collscan:

      {
              "explainVersion" : "1",
              "stages" : [
                      {
                              "$cursor" : {
                                      "queryPlanner" : {
                                              "namespace" : "test.system.buckets.weather",
                                              "indexFilterSet" : false,
                                              "parsedQuery" : {
                                                      "$and" : [
                                                              {
                                                                      "_id" : {
                                                                              "$lte" : ObjectId("60a31190ffffffffffffffff")
                                                                      }
                                                              },
                                                              {
                                                                      "_id" : {
                                                                              "$gte" : ObjectId("60a303800000000000000000")
                                                                      }
                                                              },
                                                              {
                                                                      "control.max.timestamp" : {
                                                                              "$_internalExprGte" : ISODate("2021-05-18T01:00:00Z")
                                                                      }
                                                              },
                                                              {
                                                                      "control.min.timestamp" : {
                                                                              "$_internalExprGte" : ISODate("2021-05-18T00:00:00Z")
                                                                      }
                                                              },
                                                              {
                                                                      "control.max.timestamp" : {
                                                                              "$_internalExprLte" : ISODate("2021-05-18T02:00:00Z")
                                                                      }
                                                              },
                                                              {
                                                                      "control.min.timestamp" : {
                                                                              "$_internalExprLte" : ISODate("2021-05-18T01:00:00Z")
                                                                      }
                                                              }
                                                      ]
                                              },
                                              "queryHash" : "D69A8284",
                                              "planCacheKey" : "D69A8284",
                                              "maxIndexedOrSolutionsReached" : false,
                                              "maxIndexedAndSolutionsReached" : false,
                                              "maxScansToExplodeReached" : false,
                                              "winningPlan" : {
                                                      "stage" : "COLLSCAN",
                                                      "filter" : {
                                                              "$and" : [
                                                                      {
                                                                              "_id" : {
                                                                                      "$lte" : ObjectId("60a31190ffffffffffffffff")
                                                                              }
                                                                      },
                                                                      {
                                                                              "_id" : {
                                                                                      "$gte" : ObjectId("60a303800000000000000000")
                                                                              }
                                                                      },
                                                                      {
                                                                              "control.max.timestamp" : {
                                                                                      "$_internalExprGte" : ISODate("2021-05-18T01:00:00Z")
                                                                              }
                                                                      },
                                                                      {
                                                                              "control.min.timestamp" : {
                                                                                      "$_internalExprGte" : ISODate("2021-05-18T00:00:00Z")
                                                                              }
                                                                      },
                                                                      {
                                                                              "control.max.timestamp" : {
                                                                                      "$_internalExprLte" : ISODate("2021-05-18T02:00:00Z")
                                                                              }
                                                                      },
                                                                      {
                                                                              "control.min.timestamp" : {
                                                                                      "$_internalExprLte" : ISODate("2021-05-18T01:00:00Z")
                                                                              }
                                                                      }
                                                              ]
                                                      },
                                                      "direction" : "forward",
                                                      "minRecord" : ObjectId("60a303800000000000000000"),
                                                      "maxRecord" : ObjectId("60a31190ffffffffffffffff")
                                              },
                                              "rejectedPlans" : [ ]
                                      }
                              }
                      },
                      {
                              "$_internalUnpackBucket" : {
                                      "exclude" : [ ],
                                      "timeField" : "timestamp",
                                      "metaField" : "metadata",
                                      "bucketMaxSpanSeconds" : 3600,
                                      "assumeNoMixedSchemaData" : true
                              }
                      },
                      {
                              "$match" : {
                                      "timestamp" : {
                                              "$eq" : ISODate("2021-05-18T01:00:00Z")
                                      }
                              }
                      }
              ],
              "serverInfo" : {
                      "host" : "ip-10-122-10-220",
                      "port" : 27017,
                      "version" : "5.3.0-alpha-48-g06692bd",
                      "gitVersion" : "06692bdbfa912848a884c6440caab9cfb693e93c"
              },
              "serverParameters" : {
                      "internalQueryFacetBufferSizeBytes" : 104857600,
                      "internalQueryFacetMaxOutputDocSizeBytes" : 104857600,
                      "internalLookupStageIntermediateDocumentMaxSizeBytes" : 104857600,
                      "internalDocumentSourceGroupMaxMemoryBytes" : 104857600,
                      "internalQueryMaxBlockingSortMemoryUsageBytes" : 104857600,
                      "internalQueryProhibitBlockingMergeOnMongoS" : 0,
                      "internalQueryMaxAddToSetBytes" : 104857600,
                      "internalDocumentSourceSetWindowFieldsMaxMemoryBytes" : 104857600
              },
              "command" : {
                      "aggregate" : "system.buckets.weather",
                      "pipeline" : [
                              {
                                      "$_internalUnpackBucket" : {
                                              "timeField" : "timestamp",
                                              "metaField" : "metadata",
                                              "bucketMaxSpanSeconds" : 3600,
                                              "assumeNoMixedSchemaData" : true
                                      }
                              },
                              {
                                      "$match" : {
                                              "timestamp" : ISODate("2021-05-18T01:00:00Z")
                                      }
                              }
                      ],
                      "cursor" : {
      
                      },
                      "collation" : {
      
                      }
              },
              "ok" : 1,
              "$clusterTime" : {
                      "clusterTime" : Timestamp(1641804443, 4),
                      "signature" : {
                              "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                              "keyId" : NumberLong(0)
                      }
              },
              "operationTime" : Timestamp(1641804443, 4)
      }
      

            Assignee:
            ian.boros@mongodb.com Ian Boros
            Reporter:
            daniel.gomezferro@mongodb.com Daniel Gomez Ferro
            Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

              Created:
              Updated:
              Resolved: