Mongooseで重複した値が登録できなくするuniqueが利かない
- Post AuthorBy pitang1965
- Post DateThu Sep 12 2019
前回の投稿から約一ヶ月空いてしまいましたが、NoSQLのMongoDBや、そのオブジェクトモデリングツールであるMongooseを学習中です。ツールとしてPostmanやRobo 3T(Windows上で動作するElectronによるデスクトップアプリと思います)を使いながらやっています。
その中でしばらく悩んだ問題についてメモしておきます。
ちょっと悩んだ問題
ユーザー情報を格納するコレクション(RDBのテーブルに相当)にemailというフィールド(RDBの列に相当)があり、同じemailのドキュメント(RDBの行又はレコードに相当)を格納しないようにしたいと思いました。ここで次のようにコードを書きました。
const userScheme = new mongoose.Schema({ name: { type: String, required: true, trim: true }, email: { type: String, unique: true, // ★これを追加★ required: true, trim: true, lowercase: true, validate(value) { if (!validator.isEmail(value)) { throw new Error('不適切な電子メールアドレス(email)です。') } } }, : :
しかし、Postmanから同じemailのユーザーを重複登録できてしまいました。
解決方法
インターネットで調べたら、 Mongodb – Mongoose Unique index not working! – Stack Overflow などが見つかりましたが、結果的には次の両方をやることで解決しました。
1. データベースを削除
- 最初、Userコレクションを削除すればよいと思いこんでいました。
- 他のコレクションも含むデータベースを削除する必要がありました。
2. MongoDBのデーモンを再起動
- これは次のようなコマンドでVisual Studio Codeの一つのターミナル(PowerShell Core)から起動しているものをCtrl+Cで一度止めて再起動しました。
/Users/ユーザ名/mongodb/bin/mongod.exe --dbpath=/users/ユーザ名/mongodb-data