2013-06-15 14 views
7

私はmongodbコレクションに疎なユニークなインデックスを作成しました。Mongodbユニークな疎インデックス

var Account = new Schema({ 
       email: { type: String, index: {unique: true, sparse: true} }, 
         .... 

それは正しく作成されています

{ "ns" : "MyDB.accounts", "key" : { "email" : 1 }, "name" : "email_1", "unique" : true, "sparse" : true, "background" : true, "safe" : null } 

をしかし、私はキーで2番目の文書を挿入する場合、私はこのエラーを受け取る設定されていません:

{ [MongoError: E11000 duplicate key error index: MyDB.accounts.$email_1 dup key: { : null }] 
    name: 'MongoError', 
    err: 'E11000 duplicate key error index: MyDB.accounts.$email_1 dup key: { : null }', 
    code: 11000, 
    n: 0, 
    ok: 1 } 

任意のヒント?

+0

電子メールフィールドに「null」のドキュメントがある場合は、コレクションをチェックインすることができます。使用しているテンプレートエンジンがそのフィールドにNULL値を挿入している可能性があります。私はローカルにチェックし、うまくいきます。 –

+0

'email'を' unique'に設定すると、コレクション内のすべての文書で一意である必要があります。たとえば、「ヌル」値は1つのみです。だから、これは期待どおりに動作しているようです。 – WiredPrairie

+0

ちょうどこの質問に答えました:http://stackoverflow.com/questions/17114851/mongo-id-field-duplicate-key-error/17115770#17115770 - それは非常によく似ています(そしておそらく同じ)問題です。 – WiredPrairie

答えて

10

私もこの問題を抱えていました。私は値がヌルかユニークであることを望んでいました。

var UserSchema = new Schema({ 
    // ... 
    email: {type: String, default: null, trim: true, unique: true, sparse: true}, 
    // ... 
}); 

そして、私は、データベースが実際に(そう、これはないあるdb.users.getIndexes();

{ 
    "v" : 1, 
    "key" : { 
    "email" : 1 
    }, 
    "unique" : true, 
    "ns" : "test.users", 
    "name" : "email_1", 
    "sparse" : true, 
    "background" : true, 
    "safe" : null 
}, 

で正しくインデックスを作成していたことを確認しました:だから、私はuniquesparse両方のフラグを設定しますmongo _id field duplicate key errorと同じ)

私の間違いは、defaultの値をnullに設定していました。ある意味では、Mongooseは一意でなければならない値として明示的にnullを数えます。フィールドが定義されていない場合(またはundefined)、フィールドは一意ではありません。あなたもこの問題を抱えている場合

email: {type: String, trim: true, unique: true, sparse: true}, 

そう、あなたはデフォルト値を設定していないことを確認してください、あなたはどちらかあなたのコードのどこにもnullに値を設定していないことを確認してください。代わりに、明示的に設定する必要がある場合は、undefined(または一意の値)に設定します。

関連する問題