2015-02-14 2 views
3

Я делаю сбор данных пользователя. Это будет довольно простой, состоящий из электронной почты пользователя, пароля пользователя (хэша) и массива строк.Как сделать электронную почту пользователя уникальной в mongoDB?

{ 
    email: '[email protected]', 
    password: 'password hash', 
    arr: [] 
} 

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

Как я могу убедиться, что email остается уникальным, и, если возможно, я могу воспользоваться преимуществами производительности, предоставляемыми полем _id?

Редактировать: Я также хочу удостовериться, что нет null значений для email и что нет документов, которые не содержат поля email.

ответ

3

Вы можете сделать это, создав уникальный индекс для вашего поля электронной почты.

http://docs.mongodb.org/manual/tutorial/create-a-unique-index/

Скотт

+0

Я пробовал делать 'db.collection.ensureIndex ({email: 'text'}, {unique: true});' Но он принимает несколько вхождений '{email: null, password: 'passhash', arr: []} ', а также mutliple вхождения' {pass: 'passhash', arr: []} ' Я хочу убедиться, что нет нулевых значений, а также отсутствующих полей. Как я могу это сделать? – Ishan

+0

Создавая уникальный индекс и вставляя документ без электронной почты, вы достигнете этого. Это уродливое решение, но уникальные индексы (без разреженной опции) принимают только одно значение для поля, поэтому, если вы уже вставили документ с {email: null} или {email: ""} (которые являются разными значениями), все вставки без адрес электронной почты будет терпеть неудачу, поскольку они считаются {email: null}. Вы также можете просмотреть эти случаи в прикладном уровне. – LinJuuichi

+2

Кроме того, вы действительно должны контролировать ввод в своем приложении. Если вам нужен адрес электронной почты, было бы намного быстрее проверить его в своем приложении и поймать его там, если это не так. Не полагайтесь на базу данных, чтобы сделать это за вас. –

4

Используйте ключевое слово unique или просто укажите значение _id как адрес электронной почты.

db.collection.ensureIndex({ email: 1 }, { unique: true }) 
+0

Это хорошая идея, чтобы использовать электронную почту: 1, когда я знаю, что я буду использовать строки не целые числа, как электронная почта, как говорится здесь http://docs.mongodb.org? /manual/reference/method/db.collection.ensureIndex/#db.collection.ensureIndex, что 1 используется для восходящего порядка. Я пробовал использовать '_id', но есть проблема в том, что если аргумент' _id 'не передан, он просто генерирует id, который не то, что я хочу. – Ishan

+2

@ Ishan «1» в определении индекса для «email» представляет собой восходящий порядок (vs «-1» для убывающего порядка). Для индекса в одном поле, таком как это, порядок не имеет особого значения, поскольку один и тот же индекс может эффективно использоваться для восходящего или нисходящего поиска. Кроме того, индекс не подразумевает ничего о типе поля (строка vs int) и не имеет никакого отношения к полю '_id'. Вы действительно хотите обеспечить уникальный индекс без каких-либо пустых значений: 'db.collection.ensureIndex ({email: 1}, {unique: true, sparse: true})'. – Stennie

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