2016-05-03 15 views
9

Ho questa struttura:Come aggiungere uno schema condizionale basato su un altro campo?

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

voglio aggiungere schema condizionale basata su altro campo come questo:

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 
    } 
} 

Come si può vedere, lo schema per "moredetails" è condizionale, è possibile per raggiungere questo in mangusta?

+0

Vedi http://mongoosejs.com/docs/validation.html#update- validators-and-this – str

+0

@str non è abbastanza per me perché voglio essere in grado di collegare lo schema (e godere dei benefici degli schemi di mangimi) invece di fare la validazione da parte mia. –

+0

Per quanto ne so, non è possibile creare schemi dinamici nel modo desiderato. Quindi la convalida personalizzata è la tua unica opzione. – str

risposta

2

Non so se è troppo tardi per questo, ma penso che quello che ti serve è mongoose subdocument discriminator. Ciò consente di avere 2 diversi schemi nel documento secondario, mangusta si prenderà cura della mappatura dello schema, includendo la convalida.

Sì, ciò che è necessario archiviare in questa domanda è un problema di vecchia data ed è stato richiesto dal mangusta 3.0. Ed ora è ufficiale :)

Un esempio con una nuova discriminatore mangusta documento secondario:

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 per maggiori dettagli

Problemi correlati