我正在使用nodejs 0.6.18 expressjs 2.5.8和mongoose 2.6.7构建游戏。
我正在尝试使用mongoose存储和检索嵌入的文档。 考虑这个例子:
用户架构
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,但我无法检索嵌入了mongoose的人员。
我也尝试过没有嵌套的嵌入式拼写文档,它会产生完全相同的问题。
修改
@pat你是对的。如果我使用正确的顺序将所有Schema直接放在同一个文件(例如主app.js)中,它就会起作用。
事实是,我希望尽可能地将每个模型保存在单独的文件中(它们会增长很多)。
例如,我的用户模型包含在名为models / user.js的文件中, 可以使用module.exports
进行访问。
但是,当我尝试将我的模型链接到另一个文件中的mongoose时:mongoose.model('User', require('./models/user'));
mongoose find方法返回未定义的嵌入文档。
您对如何将我的猫鼬模型正确保存在不同的文件上有任何想法吗?
答案 0 :(得分: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] })
这将保留他们的订单。
注意:不需要subdocs作为模型,因为模型被映射到集合,但只要你不直接在你的subdocs上调用save
,他们就不会被保存到一个单独的集合中在数据库中。
答案 1 :(得分:1)
我认为,在字符和拼写之后,需要将用户模式声明为。