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

> db.names.insert({name:"Makar"})
> db.names.insert({name:"Alex"})
> db.names.insert({name:"Makar"})
> db.names.ensureIndex({name:1})

Затем я удалю обычный индекс и попытаюсь создать уникальный – получу сообщение об ошибке.

> db.names.dropIndex({name:1})
{ "nIndexesWas" : 2, "ok" : 1 }
> db.names.ensureIndex({name:1},{unique: true})
E11000 duplicate key error index: test.names.$name_1  dup key: { : "Makar" }

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

> db.names.remove({_id: ObjectId("50b1fe44f264bbd555063ec9")})
> db.names.ensureIndex({name:1},{unique: true})

После того как уникальный индекс по полю name построен я не смогу больше добавить в коллекцию документ с именем Makar.

> db.names.insert({name:"Makar"})
E11000 duplicate key error index: test.names.$name_1  dup key: { : "Makar" }

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

> db.names.insert({name:['Makar', 'Alex']})
E11000 duplicate key error index: test.names.$name_1  dup key: { : "Alex" }

Как оказалось такого сделать нельзя. Если в индексное поле я помещаю массив значений, то монго добавляет каждое значение из массива в индекс. Для следующего эксперимента я удалю индекс по полю name и все записи пожалуй тоже.

> db.names.dropIndex({name:1})
{ "nIndexesWas" : 2, "ok" : 1 }
> db.names.drop({name:1})

Теперь я добавлю документ с полями name и lastname, добавлю обычный (не уникальный) индекс, но по двум полям lastname и name. И начну вставлять в него массивы значений:

> db.names.insert({name:"Makar", lastname:"Pupkin"})
> db.names.ensureIndex({name:1,lastname:1})
> db.names.insert({name:["Alex","Ivan"], lastname:"Pupkin"})
> db.names.insert({name:"Peter", lastname:["Smith, "Jones"]})
> db.names.insert({name:["John", "Lucas"], lastname:["Ford","Perris"]})

Оказалось что я могу вставлять массив имён или массив фамилий, но не могу вставлять их вместе.

 

Комментарии

comments powered by Disqus