2015-08-13 5 views
3

У меня есть сервер Node.JS с базой данных Mondodb. Несколько клиентов используют эту же базу данных, и каждый клиент имеет свою собственную коллекцию. Коллекции называются идентификатором клиента.Mongodb auto create index для новых коллекций

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

Мне нужны все коллекции, чтобы иметь определенный индекс. Есть ли способ автоматически создать этот индекс для каждой новой коллекции?

+2

['securityIndex()'] (http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#ensureIndex) или ['createIndexes()'] (http: // mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#createIndexes)? – robertklep

+0

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

ответ

9

Нет, такой команды нет.

Но не бойтесь называть createIndex слишком часто. The documentation гарантирует, что если индекс с теми же настройками уже существует, ничего не произойдет. Таким образом, вы можете прикрепить его к некоторым общим операциям базы данных, выполняемым новыми пользователями. Это неважно, когда его звонят не один раз.

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

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

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

+0

Мне нравится ваш подход к созданию другого поля. Таким образом, у меня будет индекс, содержащий идентификатор пользователя. Будет ли он добавить много накладных расходов, чтобы иметь индекс для нескольких полей, а не только один? – Asher

+0

@Asher Это все еще одно двоичное дерево, только с более длинной длиной ключа. – Philipp

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