Можно ли вызвать securityIndex для несуществующих коллекций?

Я где-то читал, что вызов ensureIndex() фактически создает коллекцию, если она не существует. Но индекс всегда находится в некоторых полях, а не во всех из них, поэтому, если я гарантирую индекс, скажем { name:1 }, а затем добавьте документы в эту коллекцию с большим количеством полей, индекс будет работать? Я знаю, что у нас нет схемы, исходящей из мира РСУБД, я просто хочу убедиться.:) Я бы хотел создать индексы при запуске моего веб-сайта, но изначально база данных пуста. Мне не нужно иметь какие-либо данные до обеспечения индексов, верно?

Ответ 1

ensureIndex создаст коллекцию, если она еще не существует. Не имеет значения, добавляете ли вы документы, которые не имеют того свойства, которое охватывает индекс, вы просто не можете использовать этот индекс для поиска этих документов. Я понимаю, что в версиях до версии 1.7.4 документ, у которого отсутствует свойство, для которого есть индекс, будет индексироваться так, как если бы оно имело это свойство, но будет иметь нулевое значение. В версиях после 1.7.4 вы можете создавать разреженные индексы, которые вообще не включают эти объекты. Разница незначительна, но может быть значительной в некоторых ситуациях.

В зависимости от обстоятельств может быть хорошей идеей создавать индексы при запуске приложения. Рассмотрим ситуацию, когда вы развертываете новую версию, которая добавляет новые индексы при запуске, в разработке вы этого не заметите, поскольку у вас есть только небольшая база данных, но в производстве у вас может быть огромная база данных, и добавление индекса займет много времени времени. Во время создания индекса ваше приложение будет зависать, и вы не можете выполнять запросы. Вы можете создавать индексы с флагом фона, установленным в true (синтаксис зависит от того, какой драйвер вы используете), но в большинстве случаев лучше добавлять индексы вручную или как часть настройки script. Таким образом вам придется подумать, прежде чем обновлять индексы.