javascript Expressjs Mongoose find嵌套的嵌入文档未定义

e3bfsja2  于 2023-05-21  发布在  Java
关注(0)|答案(2)|浏览(83)

我正在用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 }
});

** 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正确保存和检索了User文档。但是,关联的嵌入文档是undefined
我想确保我的文档被保存,所以我直接向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的whose。
我也试过没有嵌套的嵌入式拼写文档,这产生了完全相同的问题。

编辑

@pat你是对的。如果我把所有的Schemas以正确的顺序直接放在同一个文件中(例如主app.js),它就能工作。
事实上,我想尽可能地将每个模型保存在单独的文件中(它们会增长很多)。
例如,我的User模型包含在一个名为models/user.js的文件中,并且 * 应该 * 可以使用上面的module.exports访问。
但是,当我尝试将我的模型链接到另一个文件中的mongoose时:mongoose.model('User', require('./models/user')); mongoose find方法返回未定义的嵌入文档。
你有什么想法如何正确地保持我的 Mongoose 模型在单独的文件?

1szpjjfi

1szpjjfi1#

用户模式文件应该首先要求顶部的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] })

这将保持他们的秩序。
注意:子文档并不一定是模型,因为模型被Map到集合,但是只要你没有直接在子文档上调用save,它们就不会被保存到数据库中的一个单独的集合中。

fae0ux8s

fae0ux8s2#

我相信User模式需要在Character和Spell之后声明。

相关问题