#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, и он не жаловался.