2016-05-03 2 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- validators-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 для более подробной информации

Смежные вопросы