2016-05-03 5 views
9

私はこのような構造を持っている:私はこのような他のフィールドに基づいて、条件付きスキーマを追加したい他のフィールドに基づいて条件付きスキーマを追加する方法は?

{ 
    personFullName: String, 
    personMobileOS: Number // 1 = IOS, 2 = Android, 
    moreDetails: Mixed 
} 

:あなたが見ることができるように

if (personMobileOS === 1) { // IOS 
    moreDetails = { 
     iosVersion: Number, 
     loveApple: Boolean 
    } 
} else if (personMobileOS === 2) { // Android 
    moreDetails = { 
     wantToSell: Boolean, 
     wantToSellPrice: Number 
     wantToSellCurrency: Number // 1 = Dollar, 2 = Euro, 3 = Pound 
    } 
} 

、「moreDetails」のスキーマが条件付きである、それは可能ですこれをマングースで達成するには?

+0

を参照してください http://mongoosejs.com/docs/validation.html#update- validator-and-this – str

+0

@str私は自分自身で検証するのではなく、スキーマをプラグインできる(そして、マングーススキーマのメリットを享受できる)ために、私にとっては十分ではありません。 –

+0

私が知る限り、あなたが望む方法で動的スキーマを作成することはできません。カスタム検証はあなたの唯一の選択肢です。 – str

答えて

2

これが遅すぎるかどうかわかりませんが、必要なのはmongoose subdocument discriminatorだと思います。これにより、サブ文書上に2つの異なるスキーマを持つことができ、mongooseはスキーママッピングを処理し、検証を含めます。

はい、この質問でアーカイブする必要があるのは長年にわたる問題であり、mongoose 3.0以降にリクエストされています。そして今、それは公式だ:)

新しいマングースのサブドキュメントの弁別と例:詳細は

const eventSchema = new Schema({ message: String }, 
    { discriminatorKey: 'kind' }); 

const Event = mongoose.model('Event', eventSchema); 

const ClickedEvent = Event.discriminator('Clicked', new Schema({ 
    element: { 
    type: String, 
    required: true 
    } 
})); 

const PurchasedEvent = Event.discriminator('Purchased', new Schema({ 
    product: { 
    type: String, 
    required: true 
    } 
})); 

Also checkout this blog post

関連する問題