2015-04-03 2 views
0

Для тех, кто играет в Guild Wars 2, эта схема может выглядеть знакомой. Я пытаюсь загрузить все элементы через свой API, и у меня возникли проблемы с получением встроенного свойства «details» для маршалинга и/или сохранения. Это мой первый удар при использовании мангуста, поэтому я надеюсь, что есть проблема со всей очевидностью здесь:Mongoose Embeded Document Not Saving

Вот мое определение схемы:

var ItemSchema = new Schema({ 
    _id: Number, 
    name: String, 
    icon: String, 
    description: String, 
    type: String, 
    rarity: String, 
    level: Number, 
    vendor_value: Number, 
    default_skin: Number, 
    flags: [String], 
    game_types: [String], 
    restrictions: [String], 
    details: {    // This is the problem property 
     type: String, 
     weight_class: String, 
     defense: Number, 
     infusion_slots: { 
      flags: [String], 
      item_id: Number 
     }, 
     infix_upgrade: { 
      attributes: [{ 
       attribute: String, 
       modifier: Number 
      }], 
      buff: { 
       skill_id: String, 
       description: String 
      } 
     }, 
     suffix_item_id: Number, 
     size: Number, 
     no_sell_or_sort: Boolean, 
     description: String, 
     duration_ms: Number, 
     unlock_type: String, 
     color_id: Number, 
     recipe_id: Number, 
     charges: Number, 
     flags: [String], 
     infusion_upgrade_flags: [String], 
     suffix: String, 
     bonuses: [String], 
     damage_type: String, 
     min_power: Number, 
     max_power: Number 
    } 
}); 

Я попытался сохранить входящие объектов через обе вставки и findOneAndUpdate (upsert).

var gwItem = // grab from API. 
Item.remove({_id: gwItem.id}).exec(); 
// At this point, details looks like an object property. 
gwItem['_id'] = gwItem.id; 
var item = new Item(gwItem); 
// At this point, calling item.toObject() shows no 'details' property set... 
item.save().exec(); // 'details' not saved here 
// Do below in replacement of item.save(); 
gwItem['$setOnInsert'] = {_id: gwItem.id}; 
// This saves 'details' property with a value of '[object Object]'... 
Item.findOneAndUpdate({_id: gwItem.id}, gwItem, {upsert:true}, function(){}); 

Пример того, что API отправляет и заполняется в «gwItem» в коде выше: https://api.guildwars2.com/v2/items/68743

Что я делаю не так?

ответ

1

Это из-за того, как Mongoose определяет схемы. Так как вы использовали ключевое слово type в качестве имени пути для details, оно определяет details как поле String, а остальные ваши пути - это параметры для details. Просто измените type: String на type: {type: String}, и все должно быть готово. Больше информации here.