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メソッドは未定義の埋め込みドキュメントを返します。
私のマングースモデルを別々のファイルに適切に保持する方法について何かアイデアはありますか?