エラーメッセージは、null
のレコードがすでに存在することを示しています メールとして。つまり、メールアドレスを持たないユーザーがすでにいます。
これに関連するドキュメント:
ドキュメントに一意のインデックスのインデックス付きフィールドの値がない場合、インデックスはこのドキュメントのnull値を格納します。一意の制約があるため、MongoDBはインデックス付きフィールドがないドキュメントを1つだけ許可します。インデックス付きフィールドの値がないドキュメントが複数ある場合、またはインデックス付きフィールドがない場合、インデックスの作成は重複キーエラーで失敗します。
一意性制約をスパースインデックスと組み合わせて、一意性インデックスからこれらのnull値をフィルタリングし、エラーを回避できます。
一意のインデックス
スパースインデックスには、インデックスフィールドにnull値が含まれている場合でも、インデックスフィールドを持つドキュメントのエントリのみが含まれます。
つまり、スパースインデックスは、すべてnull
を持つ複数のドキュメントで問題ありません。 値。
スパースインデックス
コメントから:
エラーは、キーの名前がmydb.users.$email_1
であることを示しています。 これにより、両方のusers.email
にインデックスがあるのではないかと思われます。 およびusers.local.email
(前者は現在古く、使用されていません)。 Mongooseモデルからフィールドを削除しても、データベースには影響しません。 mydb.users.getIndexes()
で確認してください この場合は、mydb.users.dropIndex(<name>)
を使用して不要なインデックスを手動で削除してください 。