2015-08-31 4 views
1

У меня есть коллекция обновлений хранилища. Это предопределенная коллекция «шаблонов», содержащая, например, max_capacity, уровень и цену. Затем у меня есть коллекция storage_levels, которая содержит разные индексы для хранилища_пакетов для разных хранимых ресурсов. Но я не могу создать warehouse_level модель, потому что мне нужно загрузить _ids из warehouse_upgradesЗначение по умолчанию Mongoose Schema для ObjectId

WarehouseUpgrade = mongoose.model("warehouse_upgrade"); 

// find wheat upgrade containing level 0 
WarehouseUpgrade.find({ type: "wheat", level: 0 }).exec(function (err, wheat) { 

    var warehouseLevelSchema = Schema({ 
     wheat: { 
      type: Schema.Types.ObjectId, 
      ref: "warehouse_upgrade", 
      default: wheat._id 
     }, 
     ... more resources 
    }; 
    var WarehouseLevel = mongoose.model("warehouse_level", warehouseLevelSchema); 
} 

Когда я хочу позвонить вар WarehouseLevel = mongoose.model («warehouse_level»); интерпретируя этот код бросает ошибку:

MissingSchemaError: Schema hasn't been registered for model "warehouse_level" 

Если извлечь из определения схемы из WarehouseUpgrade.find, то код работает, но я не могу установить значения по умолчанию для хранилищ ресурсов.

Как установить значение по умолчанию для ObjectId из другой коллекции, когда я не хочу жестко задавать эти значения?

EDIT: загружает все определения схемы в файл с именем mongoose.js:

var mongoose   = require("mongoose"), 
Animal     = require("../models/Animal"); 
Warehouse_upgrade  = require("../models/Warehouse_upgrade"), 
Warehouse_level   = require("../models/Warehouse_level"), 
User     = require("../models/User"), 
... 

module.exports = function(config) { 
    mongoose.connect(config.db); 
    var db = mongoose.connection; 

    // And now I call methods for creating my "templates" 
    Warehouse_upgrade.createUpgrades(); 
    Animal.createAnimals(); 
    User.createDefaultUser(); 
} 

MissingSchemaError происходит в модели/пользователь (имя пользователя, hashed_password, электронная почта, warehouse_level, ...) - у каждого пользователя есть ссылка к его собственному документу на складе_level.

// User 
var mongoose = require("mongoose"), 
    Schema = mongoose.Schema, 
    Warehouse_level = mongoose.model("warehouse_level"); 

// There are no users in DB, we need create default ones 
// But first, we need to create collection document for warehouse_level 
// and warehouse (not shown in this code snippet) 
Warehouse_level.create({}, function (err, warehouseLevel) { 
    if (err) { console.error(err); return; } 
    // warehouse_level document is created, let's create user 
    User.create({ username: ..., warehouse_level: warehouseLevel._id }); 
}); 
+0

вы, возможно, придется использовать объект внутри вашего ключа по умолчанию, например, по умолчанию: { – Zargold

+0

Привет - схема, определенная как: var Schema = DB.mongoose.Schema; – Zargold

+0

var Schema = DB.mongoose.Schema; throws error - Ошибка ссылки - DB не определена – James07

ответ

0

Одним из возможных путей достижения этой цели является создание метода, как «setDefaultIndexes»

var warehouseLevelSchema = mongoose.Schema({..}); 

warehouseLevelSchema.methods = { 
    setDefaultUpgrades: function() { 
     var self = this; 
     WarehouseUpgrade.find({ level: 0 }).exec(function (err, collection) { 
      for (var i = 0; i < collection.length; i++) { 
       var upgrade = collection[i]; 
       self[upgrade.type] = upgrade._id; 
      } 
      self.save(); 
     }); 
    } 
}; 

var Warehouse_level = mongoose.model("warehouse_level", warehouseLevelSchema); 

И называют его после создания нового warehouse_level:

WarehouseLevel.create({}, function (err, warehouseLevel) { 
    if (err) { console.error(err); return; } 
    warehouseLevel.setDefaultUpgrades(); 
}); 
Смежные вопросы