2013-12-26 4 views
1

Я пытаюсь создать и попытаться написать дубликат по уникальному индексу MongoDB для тестирования. Мой код по существу:Уникальный индекс не настолько уникален

db.collection("foo").ensureIndex({a: 1}, {unique: true}, function() { 
    db.collection("foo").insert({a: "foo"}, function() { 
     db.collection("foo").insert({a: "foo"}); 
    }); 
}); 

Однако это ни в коем случае не должно быть. Если я подключусь к моей БД и запустил db.foo.find({a: "foo"}), я найду два результата. Это означает, что {unique: true} не работает должным образом/ничего не делает/etc.

Использование createIndex не работает.

Я использую уникальные индексы MongoDB?

+3

вы должен проверять параметр 'err' (т.е. первый) на ваши обратные вызовы, чтобы помочь диагностировать проблему. – JohnnyHK

+0

Я не могу воспроизвести этот запуск того же кода (завернутый в соединение). Это ошибки, как ожидалось, оставляя в результате 1 doc в db. – numbers1311407

ответ

2

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

Как вы используете NodeJS, вы должны проверить, что первый параметр функции обратного вызова, чтобы проверить на наличие ошибок (большинство NodeJS API, с обратных вызовов по этой модели, как и родной драйвер MongoDB NodeJS):

db.collection("foo").ensureIndex({a: 1}, {unique: true}, function (err) { 
    if(err) { console.log('failed to create index: ', err); return; } 
    db.collection("foo").insert({a: "foo"}, function (err) { 
      if(err) { console.log('first insert failed: ', err); return; } 
      db.collection("foo").insert({a: "foo"}, function (err) { 
       if(err) { 
        console.log('insert failed:', err); 
        return; 
       } 
     }); 
    }); 
}); 
+0

Это прекрасно, но главная проблема заключается в том, что, несмотря на то, что ошибка порождена, дубликат записи все еще вставлен –

+0

Есть ли какие-либо из ошибок, отображаемых? Я только что запустил код как есть, и единственная ошибка: «MongoError: E11000 дублирует ключевой индекс ошибки: test123.foo. $ A_1 dup key: {:« foo »}' Вы можете попробовать добавить «background: false» в опции. – WiredPrairie

+0

И если у вас уже есть дубликаты, вам нужно либо очистить коллекцию, либо добавить: '{dropDups: true}', чтобы принудительно исправить данные (http://docs.mongodb.org/manual/core/index-creation/). Индекс не будет создан, если есть дубликаты. – WiredPrairie

0

после того, как я попробовал в своем монго, я боюсь, что код полезен. и запись будет уникальной после обеспечения-индекса. вы можете проверить версию mongo или установить err в обратном вызове, чтобы найти какой-либо синтаксический ошибку.

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