Подтвердить что ты не робот

Mongodb: когда звонить secureIndex?

Когда мне нужно вызвать securityIndex? Прежде чем вставлять одну запись, после вставки одной записи или перед вызовом find()?

Привет,

Джонни

4b9b3361

Ответ 1

Кажется, мой комментарий был немного непонят, поэтому я уточню. Это не имеет большого значения, когда вы называете это, пока он вызывает в какой-то момент, прежде чем вы вызовете find() в первый раз. Другими словами, это не имеет большого значения, когда вы создаете индекс, до тех пор, пока он не будет использоваться для его использования.

Общим шаблоном, который я видел много, является кодирование ensureIndex в то же время (и там же) как вызов find(). ensureIndex будет проверять, существует ли индекс и создать его, если это не так. Несомненно, некоторые накладные расходы (хотя и очень маленькие) при вызове securityindex перед вызовом find(), поэтому предпочтительнее не делать этого.

Я вызываю ensureIndex в коде, чтобы упростить развертывание и избежать необходимости отдельно управлять db и codebase. Компромисс простоты развертывания уравновешивает избыточность последующих вызовов для обеспеченияIndex (для меня.)

Ответ 2

Я бы рекомендовал вызвать securityIndex один раз, когда ваше приложение запустится.

Ответ 3

Это не имеет значения, но вам нужно только сделать это один раз. Если вы хотите вставлять большой объем данных в пустую коллекцию, лучше всего создать индекс после вставок, но в противном случае это не имеет особого значения.

Ответ 4

Вам нужно сделать это только один раз. Пример:

db.table.insert({foo: 'bar'});
var foo = db.table.findOne({foo: 'bar'}); // => delivered from FS, not RAM
db.table.ensureIndex({foo: 1});
var foo = db.table.findOne({foo: 'bar'}); // => delivered from RAM, not FS
db.table.insert({foo: 'foo'});
var foo = db.table.findOne({foo: 'foo'}); // => delivered from RAM, not FS

Ответ 5

Если вы добавляете индекс перед рукой, каждый вызов insert/update/delete должен также изменять каждый индекс. Таким образом, с точки зрения оптимизации вы, вероятно, захотите отложить ее как можно дольше, прежде чем выпускать запросы. Однако, с точки зрения функциональности, это не имеет значения.

Ответ 6

Я обычно помещаю свои вызовы ensureIndex() в блок init для части моего приложения, которое управляет связью с MongoDB. Кроме того, я обертываю эти вызовы ensureIndex() внутри проверки на наличие коллекции, которую я знаю, должен существовать для приложения для работы; Таким образом, вызовы secureIndex() вызываются только когда-либо, когда-либо, при первом запуске приложения с конкретным экземпляром MongoDB.

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

Пример драйвера Java MongoDB:

DB db = mongo.getDB("databaseName");
Set<String> existingCollectionNames = db.getCollectionNames();

// init collections; ensureIndexes only if creating collection
// (let application set up the db if it not already)
DBCollection coll = db.getCollection("collectionName");
if (!existingCollectionNames.contains("collectionName")) {
// ensure indexes...
coll.ensureIndex(BasicDBObjectBuilder.start().add("date", 1).get());
    // ...
}

Ответ 7

Если у вас есть коллекция, в которой есть миллионы записей, и вы создаете несколько составных индексов с отключенной автоматической индексацией, вы ДОЛЖНЫ обеспечить, чтобы вы вызывали securityIndexes() задолго до вашего первого поиска, возможно, синхронно, то есть после метода makeIndexes возвращается.

Режим (переднего и заднего), в котором индексы строятся, добавляет дополнительную сложность. Режим Foreground блокирует полный db, когда он строит индексы, тогда как фоновый режим позволяет вам запрашивать db. Однако фоновый режим построения индекса занимает дополнительное время.

Итак, вы должны убедиться, что индексы были созданы успешно. Вы можете использовать db.currentOp(), чтобы проверить прогресс обеспеченияIndexes(), пока он все еще создает индексы.