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 之后声明,我相信。