Uploaded image for project: 'Mongoid'
  1. Mongoid
  2. MONGOID-3862

Hashed index, uniqueness and hint

    • Type: Icon: Task Task
    • Resolution: Done
    • Priority: Icon: Major - P3 Major - P3
    • 5.0.2
    • Affects Version/s: None
    • Component/s: None
    • Labels:
      None

      My setup:

      class ImportQueue
        include Mongoid::Document
        include Mongoid::Timestamps
        include Mongoid::Attributes::Dynamic
      
        field :attrs, :type => Hash # attrs to import
        index({ :attrs => "hashed" }, { :background => true })
        validates :attrs, :presence => true, :uniqueness => true
      end
      

      The problem is in that the uniqueness validator issues the next query:

      find({ attrs: { k: 'v' }).sort({ _id: 1 })
      

      Explain shows the next:

      {
              "cursor" : "BtreeCursor _id_",
              "isMultiKey" : false,
              "n" : 1,
              "nscannedObjects" : 175164,
              "nscanned" : 175164,
              "nscannedObjectsAllPlans" : 350328,
              "nscannedAllPlans" : 350328,
              "scanAndOrder" : false,
              "indexOnly" : false,
              "nYields" : 116,
              "nChunkSkips" : 0,
              "millis" : 1225,
              "indexBounds" : {
                      "_id" : [
                              [
                                      {
                                              "$minElement" : 1
                                      },
                                      {
                                              "$maxElement" : 1
                                      }
                              ]
                      ]
              },
              "server" : "...:27017"
      }
      

      So the index on attrs is not used. But if we change the query to:

      find({ attrs: { k: 'v' }).sort({ _id: 1 })._addSpecial( "$hint", { attrs: 'hashed' } )
      

      Explain shows:

      {
              "cursor" : "BtreeCursor attrs_hashed",
              "isMultiKey" : false,
              "n" : 1,
              "nscannedObjects" : 1,
              "nscanned" : 1,
              "nscannedObjectsAllPlans" : 1,
              "nscannedAllPlans" : 1,
              "scanAndOrder" : true,
              "indexOnly" : false,
              "nYields" : 0,
              "nChunkSkips" : 0,
              "millis" : 0,
              "indexBounds" : {
                      "attrs" : [
                              [
                                      NumberLong("5173886864922833935"),
                                      NumberLong("5173886864922833935")
                              ]
                      ]
              },
              "server" : "...:27017"
      }
      

      I do not want to say this is a bug, just an observation. I think that could be solved by a custom validation. But perhaps there is something we can do with this, like if a field has an index and we validating uniqueness on that field the hint could be added automatically.

            Assignee:
            Unassigned Unassigned
            Reporter:
            alexs Alexander S.
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved: