Для эффективной сортировки в mongo необходимо ли изменять поле _id?

#ruby-on-rails #ruby #mongodb #mongoid

#ruby-on-rails #ruby #mongodb #mongoid

Вопрос:

У меня есть документ, в котором всего около 200 элементов. Но я все еще получаю очень медленный ответ, просто запрашивая его следующим образом:

 Product.order_by([:name, :asc]).limit(20)
  

У меня есть индекс по имени, который, как я проверил, существует в оболочке mongo. Это единственный способ вернуть эффективно отсортированные результаты, чтобы изменить их значение _id на что-то вроде

 "#{name}_#{random_id}"
  

Ответ №1:

Короткий ответ: абсолютно нет. Длинный ответ: давайте убедимся, что запрос использует ваш индекс (а не только то, что индекс существует).

Наш запрос:

При этом не используется индекс (в данном случае, потому что он не существует)

 db.products.find().sort( { name: -1}).explain()
{
    "cursor" : "BasicCursor",
    "nscanned" : 1042,
    "nscannedObjects" : 1042,
    "n" : 1042,
    "scanAndOrder" : true,
    "millis" : 5,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
        }
  

Давайте докажем это

 db.products.getIndexes()
[
    {
        "name" : "_id_",
        "ns" : "project_development.products",
        "key" : {
            "_id" : 1
        }
    }
]
  

Создайте индекс

 db.products.ensureIndex({name:1});
  

Теперь, когда мы объясняем запрос:

 db.products.find().sort( { name: -1}).explain()
{
    "cursor" : "BtreeCursor name reverse",
    "nscanned" : 1042,
    "nscannedObjects" : 1042,
    "n" : 1042,
    "millis" : 2,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
        "name" : [
            [
                {
                    "$maxElement" : 1
                },
                {
                    "$minElement" : 1
                }
            ]
        ]
    }
}
  

Комментарии:

1. Большое спасибо, раньше я имел в виду products как product, и он не жаловался.