2014-12-24 3 views
0

Я начал получать правильную индексацию в Mongo, но есть одна вещь, которую я немного смутил.Mongo индексы при поиске по одному значению, сортировка по другому

Если я хочу искать на одном поле (уровень) и сортировать по другому (случайному), как мне настроить этот индекс? Какое поле на первом месте?

Примечание: выше, случайным, я имею в виду, что у меня есть поле, называемое случайным. Я не сортирую в случайно выбранном поле.

ответ

1

Сортировка по «случайному» полю в mongodb - не очень хорошая идея. Если сортировка не индексируется, сортировка будет выполнена в памяти, что является проблемой для больших наборов результатов.

Индекс может поддерживать операции сортировки в поднаборе без префикса шаблона ключа индекса. Для этого запрос должен включать условия равенства для всех префиксных ключей, которые предшествуют ключам сортировки. Так что, если ваш индекс {а: 1, б: 1} вы можете иметь запрос, как этот

db.data.find ({а: "Foo"}) .sort ({Ь: 1})

Mongobd документация объясняет это хорошо: http://docs.mongodb.org/manual/tutorial/sort-results-with-indexes/

Edit: на основе обновленного вопрос ваш индекс должен быть {уровень: 1, случайное: 1}

+0

Извините за путаницу. У меня есть поле, называемое случайным, которое имеет случайное значение, чтобы создать случайный порядок. Я уточню в ОП. Но спасибо за ответ. В принципе, всегда индекс от самого большого набора до наименьшего? – RhoVisions

+0

В этом случае ваш индекс должен быть {level: 1, random: 1}, но убедитесь, что ваш запрос включает равенство по уровню. Чтобы сортировка использовала индекс, перед запросом должна быть включена часть до сортировки. Поэтому, если у вас есть индекс {a: 1, b: 1, c: 1}, запросы db.data.find (a: "foo", b: "bar"). Sort ({c: 1}) и db. data.find (a: "foo"). sort ({b: 1}) будет использовать индекс, но запрос db.data.find (a: "foo"). sort ({c: 1}) не будет использовать индекс и придется сортировать по памяти. – Gennadiy

Смежные вопросы