2012-04-27 13 views
19

は、次のスキーマを考えます。 どうすれば定義できますか?マングース:スキーマフィールドをIDに設定する方法は?私は<code>email</code>がキーになりたい</p> <pre><code>var UserSchema = new Schema({ , email : { type: String } , passwordHash : { type: String } , roles : { type: [String] } }); </code></pre> <p>:

私は何ができる

var UserSchema = new Schema({ 
     , _id: { type: String } 
     , passwordHash : { type: String } 
     , roles : { type: [String] } 
    }); 

ので、MongoDBは、IDフィールドとしてそれを認識し、自分のコードを適応させる_id代わりのemailを参照するが、それは私にはきれいな感じがしないでしょう。

誰でも?

+7

私はあなたがオブジェクトIDとして_idを残し、ユニークインデックスのメールを作るほうだと思う。それを含めるには、あなたはtoObject()またはtoJSON()コールでvirtuals: trueオプションを設定する必要があります。 – JohnnyHK

+0

これは一般的なコンセンサスですか? Domain-IdをUniqueとし、MongoDBが技術的IDを管理できるようにしますか? –

+0

あなたはMongooseを使用しているので、別のオプションとして、電子メール文字列を_idフィールドとして使用し、返された「email」という名前の[仮想フィールド](http://mongoosejs.com/docs/virtuals.html) _idは電子メールを使用するコードをクリーンアップします。 – JohnnyHK

答えて

32

あなたはマングースを使用しているので、一つの選択肢は_idフィールドとして電子メールの文字列を使用して、電子メールを使用するコードをクリーンアップする_idを返しemailという名前virtual fieldを追加することです。

var userSchema = new Schema({ 
    _id: {type: String}, 
    passwordHash: {type: String}, 
    roles: {type: [String]} 
}); 

userSchema.virtual('email').get(function() { 
    return this._id; 
}); 

var User = mongoose.model('User', userSchema); 

User.findOne(function(err, doc) { 
    console.log(doc.email); 
}); 

無地JSオブジェクトまたはJSON文字列にマングースドキュメントを変換する際に、仮想フィールドはデフォルトで含まれていないことに注意してください。

var obj = doc.toObject({ virtuals: true }); 
var json = doc.toJSON({ virtuals: true }); 
+1

オペレーションコードがあなたのソリューションを使ってどのように見えるかを教えてください。 –

+1

@ZackS良いアイデア - 追加されました。 – JohnnyHK

+0

答えをより完全にするために、私は仮想フィールドについての詳細を追加しました。よくある質問です。 –

関連する問題