1

倉庫のアップグレードのコレクションがあります。これは、max_capacity、レベル、価格などを含む定義済みの「テンプレート」コレクションです。次に、warehouse_levels コレクションがあります。これには、さまざまな保存リソースの Warehouse_upgrades へのさまざまなインデックスが含まれています。しかし、warehouse_upgrades の _ids をロードする必要があるため、warehouse_level モデルを作成できません。

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

var WarehouseLevel = mongoose.model("warehouse_level"); を呼び出したい場合 このコードを解釈すると、エラーがスローされます。

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

WarehouseUpgrade.find からスキーマ定義を抽出すると、コードは機能しますが、リソース ウェアハウスの既定値を設定できません。

この値をハードコーディングしたくない場合、別のコレクションから ObjectId のデフォルト値を設定するにはどうすればよいですか?

編集: 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();
}

モデル/ユーザー (username、hashed_pa​​ssword、email、warehouse_level、...) で MissingSchemaError が発生します。すべてのユーザーは、warehouse_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 });
}); 
4

1 に答える 1

1

これを実現する方法の 1 つは、「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();
});
于 2015-09-01T10:04:14.500 に答える