2012-12-24 5 views
6

Userスキーマがあり、usernameフィールドを持っています。私はこのフィールドを大文字と小文字を区別するようにしたいので、ユーザーはBobDylanのような名前を登録することができます。しかし、私は、bobdylanのような機密情報を入れて、重複がないことを確認するために新しいエントリを検証するために私のスキーマが必要です。データを正規化するためのマングースゲッター/セッター

私の研究は、それが一意である場合、私は簡単に確認できるように、私は、下ケース/大文字のバージョンを格納するためのスキーマに追加フィールドを作成する必要があることを教えてくれました。私の質問は、どのように私はMongoose APIでこれを達成できますか?

私のような、set機能を使用して試してみました:

UserSchema.path('username_lower_case').set(function(username_lower_case) { 
    return this.username.toLowerCase() 
}); 

ただし、この機能が実行されていないようです。私は基本的には、username_lower_caseにはusernameが何であるかを伝える必要がありますが、小文字です。

答えて

10

1つの方法は、事前セーブフックを使用してそれを行うことです。

UserSchema.pre('save', function (next) { 
    this.username_lower_case = this.username && this.username.toLowerCase(); 
    next(); 
}); 

もう一つの方法は、仮想usernameを作るために次のようになります。

UserSchema.virtual('username').set(function (value) { 
    this.username_raw = value; 
    this.username_lower_case = value && value.toLowerCase(); 
}).get(function() { 
    return this.username_raw; 
}); 
+0

ありがとう!検証前に事前保存が行われますか? –

+1

私は確かではありませんが、あなたが 'save'を呼び出すと、検証フックは' pre-save'フックの前に実行されると思います。少なくとも、それは最も理にかなっています。 –

関連する問題