Mongooseで重複した値が登録できなくするuniqueが利かない

2019-10-21

前回の投稿から約一ヶ月空いてしまいましたが、NoSQLのMongoDBや、そのオブジェクトモデリングツールであるMongooseを学習中です。ツールとしてPostmanRobo 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のユーザーを重複登録できてしまいました。

PostmanからのUserドキュメントの追加テスト

解決方法

インターネットで調べたら、 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