Когда и почему AutoIndex с MongoDB? [Дубликат]

// vanillaJS
function isJSON(str) {
    try {
        return (JSON.parse(str) && !!str);
    } catch (e) {
        return false;
    }
}

Использование: isJSON({}) будет false, isJSON('{}') будет true.

Чтобы проверить, что что-то есть Array или Object ( проанализировано JSON):

// vanillaJS
function isAO(val) {
    return val instanceof Array || val instanceof Object ? true : false;
}

// ES2015
var isAO = (val) => val instanceof Array || val instanceof Object ? true : false;

Использование: isAO({}) будет true, isAO('{}') будет false.

91
задан Nick S. 15 January 2013 в 22:49
поделиться

2 ответа

Я никогда не понимал, почему документация Mongoose так широко рекомендует отключать autoIndex в производстве. После добавления индекса последующие вызовы ensureIndex будут просто видеть, что индекс уже существует и затем возвращается. Таким образом, это влияет только на производительность при первом создании индекса, и в то время коллекции часто пустые, поэтому создание индекса в любом случае будет быстрым.

Мое предложение оставить autoIndex если у вас нет конкретной ситуации, когда это создает проблемы; например, если вы хотите добавить новый индекс в существующую коллекцию, в которой есть миллионы документов, и вам нужно больше контролировать, когда она создана.

97
ответ дан JohnnyHK 20 August 2018 в 08:28
поделиться
  • 1
    У меня есть вопрос добавить ... Что делать, если я устанавливаю его ложным? Чем будут создаваться индексы, когда я вставляю данные или мне нужно явно их создать. Прошу прощения, если это новичок, но было бы очень полезно, если бы вы ответили. – Saransh Mohapatra 21 June 2013 в 15:18
  • 2
    @SaranshMohapatra Когда autoIndex является ложным, вам нужно вызвать makeIndexes на вашей модели, чтобы создать свои индексы. – JohnnyHK 23 June 2013 в 16:10
  • 3
    Чем я буду называть это каждый раз или просто определяя модель? – Saransh Mohapatra 24 June 2013 в 16:10
  • 4
    @SaranshMohapatra, когда вы определяете (компилируете) свою модель. Я делаю это, когда я впервые запускаю приложение. Теперь трудно подумать, что нужно отказаться от всех индексов и воссоздать их, если вы измените схему. – Moss 31 July 2013 в 13:15
  • 5
    @JohnnyHK, вы все еще согласны с вашим ответом, что это почти 2016 год? – Alexander Mills 17 December 2015 в 10:04

Хотя я согласен с принятым ответом, стоит отметить, что в соответствии с руководством MongoDB это не рекомендуемый способ добавления индексов на рабочий сервер:

Если ваше приложение включает операции обеспеченияIndex (), а индекс не существует для других операционных проблем, построение индекса может оказать серьезное влияние на производительность базы данных.

Чтобы избежать проблем с производительностью , убедитесь, что ваше приложение проверяет индексы при запуске с использованием метода getIndexes () или эквивалентного метода для вашего драйвера и завершает работу, если соответствующие индексы не существуют. Всегда создавайте индексы в производственных экземплярах с использованием отдельного кода приложения во время определенных окон обслуживания.

Конечно, это действительно зависит от того, как ваше приложение структурировано и развернуто. Например, если вы развертываете в Heroku, и вы не используете функцию предварительной загрузки Heroku , скорее всего, ваше приложение не будет вообще выполнять запросы во время запуска, и поэтому, вероятно, безопасно создать индекс в это время.

В дополнение к этому из принятого ответа:

Таким образом, это только влияет на производительность при первом создании индекса и в то время коллекции часто пустые, поэтому создание индекса в любом случае будет быстрым.

Если вам удалось впервые получить модель данных и запросы, прибитые в первый раз, это нормально, и часто случай. Однако, если вы добавляете новые функции в свое приложение, с новым запросом БД на свойство без индекса, вы часто обнаруживаете, что добавляете индекс в коллекцию, содержащую многие существующие документы.

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

db.ensureIndex({ name: 1 }, { background: true });
31
ответ дан Tom Spencer 20 August 2018 в 08:28
поделиться
  • 1
    Итак, все, что вам нужно сделать, это НЕ запускать сервер до тех пор, пока все вызовы makeIndex не будут запущены для каждой коллекции. – Alexander Mills 17 December 2015 в 10:06
  • 2
    @AlexMills, как вы это гарантируете? – lonelymo 26 May 2016 в 06:09
  • 3
    async.each (Object.keys (models), function (key, cb) {models [key] .ensureIndexes (cb)}, cb) – Alexander Mills 24 February 2017 в 02:39
  • 4
    просто вызовите makeIndexes на каждой модели mongoose, дождитесь, пока все закончится, затем запустите свой сервер; Я также рекомендую ждать, когда соединения db произойдут до запуска вашего сервера – Alexander Mills 24 February 2017 в 02:40
  • 5
    что это значит {name: 1}, это то же самое, что {name: true}? – Alexander Mills 9 March 2017 в 23:56
Другие вопросы по тегам:

Похожие вопросы: