1

nodejs 0.6.18expressjs2.5.8とmongoose2.6.7でゲームを構築しています

マングースを使用して埋め込みドキュメントを保存および取得しようとしています。この例を考えてみましょう:

ユーザースキーマ

var User = module.exports = new Schema({
      username: { type: String }
    , characters: [Character]
    , created: { type: Date, default: Date.now }
});

文字スキーマ

var Character = module.exports = new Schema({
      name: { type: String }
    , spells: [Spell]
    , created: { type: Date, default: Date.now }
});

スペルスキーマ

var Spell = module.exports = new Schema({
      name: { type: String }
    , created { type: Date, default: Date.now }
});

マングース

var db = mongoose.createConnection('mongodb://localhost/mygame');
mongoose.model('User', require('./models/user'));
mongoose.model('Character', require('./models/character'));
mongoose.model('Spell', require('./models/spell')

ルート

app.get('/', function(req, res) {
  var User = db.model('User')
    , Character = db.model('Character')
    , Spell = db.model('Spell')
    , u = new User({username:'foo'})
    , c = new Character({name:'bar'});

  c.spells.push(new Spell({name:'fireball'}));
  c.spells.push(new Spell({name:'frozenball'}));
  u.characters.push(c);

  u.save(function(e, s) {
    User.find({username:'foo'}, function(err, success) {
      console.error(err);
      console.log(success);
    });
  });
});

コンソール出力

null
[ { username: 'foo',
    _id: 4fda2c77faa9aa5c68000003,
    created: Thu, 14 Jun 2012 18:24:55 GMT,
    characters: [ undefined ] } ]

ユーザードキュメントはmongooseによって正しく保存および取得されているようです。ただし、関連する埋め込みドキュメントは未定義です。

ドキュメントが確実に保存されるようにしたかったので、mongodbに直接依頼しました:

$ mongo mygame
> db.users.find({username:'foo'})
{
    "username" : "foo",
    "_id" : ObjectId("4fda2c77faa9aa5c68000003"),
    "created" : ISODate("2012-06-14T18:24:55.982Z"),
    "characters" : [
        {
            "name" : "bar",
            "_id" : ObjectId("4fda2c77faa9aa5c68000004"),
            "created" : ISODate("2012-06-14T18:24:55.986Z"),
            "spells" : [
                {
                    "name" : "fireball",
                    "_id" : ObjectId("4fda2c77faa9aa5c68000005"),
                    "created" : ISODate("2012-06-14T18:24:55.987Z")
                },
                {
                    "name" : "frozenball",
                    "_id" : ObjectId("4fda2c77faa9aa5c68000007"),
                    "created" : ISODate("2012-06-14T18:24:55.990Z")
                }
            ]
        }
    ]
}

ご覧のとおり、私のドキュメントはmongodbに正しく保存されているようですが、マングースが埋め込まれているユーザーを取得できません。

また、ネストされた埋め込みSpellドキュメントを使用せずに試しましたが、まったく同じ問題が発生します。

編集

@patその通りです。すべてのスキーマを同じファイル(たとえば、メインのapp.js)に正しい順序で直接配置すると、機能します。

実際、私は各モデルを可能な限り別々のファイルに保存したいと思っています(それらは大きく成長するでしょう)。

たとえば、私のユーザーモデルはmodels / user.jsというファイルに含まれており、上記のようにアクセスできるはずmodule.exportsです。

しかし、モデルを別のファイルmongoose.model('User', require('./models/user'));のmongooseにリンクしようとすると、mongoosefindメソッドは未定義の埋め込みドキュメントを返します。

私のマングースモデルを別々のファイルに適切に保持する方法について何かアイデアはありますか?

4

2 に答える 2

4

ユーザースキーマファイルでは、最初に上部にCharacterSchemaが必要であり、次にそれを渡します。

var CharacterSchema = require('./character');

var User = module.exports = new Schema({
      username: { type: String }
    , characters: [CharacterSchema]
    , created: { type: Date, default: Date.now }
});

同様に、CharacterSchemaファイルでは、最初に上部にSpellSchemaが必要であり、次にそれを渡す必要があります。

var SpellSchema = require('./spell');
var CharacterSchema = module.exports = new Schema({ spells: [SpellSchema] })

これにより、順序が保持されます。

注:モデルはコレクションにマップされるため、サブドキュメントは実際にはモデルである必要はありませんがsave、サブドキュメントを直接呼び出さない限り、データベース内の別のコレクションに保存されることはありません。

于 2012-06-15T19:57:49.140 に答える
1

Userスキーマは、 CharacterとSpellのに宣言する必要があると思います。

于 2012-06-14T19:54:49.270 に答える