2013-04-07 4 views
3

У меня динамическая модель данных с несколькими статическими полями, а остальные динамические. напримерДинамический sub-doc с использованием Mongoose

var item1 = { 
    title:'Door', 
    price: 30, 
    color:{selected:'blue', options:['blue', 'red']}, // dynamic 
    material:{selected:'wood', options:['iron', 'wood', 'plastic']} 
} 

var item2 = { 
    title:'T-Shirt', 
    price: 5, 
    color:{selected:'green', options:['blue', 'green']}, // dynamic 
    size:{selected:'XL', options:['XL', 'L']} // dynamic 
} 

Поля, помеченные как динамическое, не знаю по определению схемы и новые, как только может появиться динамически. Схема Я создал выглядит следующим образом:

var itemSchema = mongoose.Schema({ 
    title: String, 
    price: Number 
}); 

Похоже, Mongoose магазинов динамические поля, но на «найти» эти поля возвращения сгустков и toJSON()/ToObject() падение их. Есть ли способ конвертировать их обратно в поддоку?

ответ

1

В моем опыте Mongoose не сохраняет то, что не определено в схеме. На основании вашего itemSchema ничего, кроме title или price, не будет сохранено.

Основываясь на коде, который вы предоставили, я предполагаю, что цвет, размер и материал могут быть или не быть, но если они есть, все они соответствуют одному и тому же формату: объект с selected и options ключами. Таким образом, вы можете попробовать Mongoose Subdocuments

var selectionSchema = new Schema({ 
    selected:String, 
    options:Array 
}); 

var itemSchema = mongoose.Schema({ 
    title: {type:String, required:true}, 
    price: {type:Number, required:true}, 
    color: selectionSchema, 
    material: selectionSchema, 
    size: selectionSchema 
}); 

Обратите внимание, что color, material и size ключей не требуется, это по-прежнему позволяет им быть динамичными. Если данные присутствуют, ключ + данные будут сохранены. Если данных нет, ключ также не будет сохранен.

UPDATE:

Как вы упомянули в своем комментарии, вы не знаете, все динамические свойства заранее. В этом случае, если указать свойство на схеме как «пустой» объект, Mongoose позволит любой и все свойства на этой пустой объект, например, так:

var itemSchema = mongoose.Schema({ 
    title: {type:String, required:true}, 
    price: {type:Number, required:true}, 
    selection:{} 
}); 

Здесь selection ключ - быть " пустой "объект - может содержать size, color, material или любой другой ключ. Их не нужно знать заранее. Вы все равно можете использовать функцию selectionSchema для принудительного ввода ключей & значений этого вспомогательного объекта.

+0

Это может сработать, если бы я знал перед всеми динамическими свойствами. Дело в том, что может случиться так, что завтра я получу новое свойство, называемое возрастом. –

+0

'{}' не работал для меня. Документ сохраняется без свойств в этом поле. –

0

Я думаю, что вы должны использовать строгий вариант установлен в ложь об объявлении схемы так, чтобы другие свойства, добавленные к документу получить также сохраняются:

Здесь подробнее: http://mongoosejs.com/docs/guide.html#strict

С уважением!

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