Expressjs Mongoose找不到嵌套的embedded式文件

我正在用nodejs 0.6.18 expressjs 2.5.8和mongoose 2.6.7构build游戏。

我试图用mongoose来存储和检索embedded的文件。 考虑这个例子:

用户架构

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

mongoose

 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检索。 但是,关联的embedded式文档是不确定的

我想确保我的文档已经保存了,所以我直接问了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,但我无法检索谁embeddedmongoose。

我也尝试没有嵌套的embedded式拼写文件,产生完全相同的问题。

编辑

@pat你是对的。 如果我把所有的模式直接放在同一个文件中(例如主要的app.js),它就可以工作。

事实上,我想尽可能将每个模型保存在不同的文件中(它们会增长很多)。

例如,我的用户模型包含在一个名为models / user.js的文件中, 应该可以像上面那样使用module.exports进行访问。

但是,当我尝试链接我的模型mongoose在另一个文件: mongoose.model('User', require('./models/user')); mongoose find方法返回未定义的embedded式文档。

你有什么想法如何正确保持我的mongoose模型在单独的文件?

用户模式文件首先需要顶部的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在你的子目录中,他们将不会被保存到数据库中的一个单独的集合。

User Schema需要 Character和Spell 之后声明,我相信。