Я строю игру с nodejs 0.6.18 expressjs 2.5.8 и mongoose 2.6.7.Expressjs 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 }
});
Spell схема
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 ] } ]
Похоже, что документ пользователя правильно сохранены и восстановлены с помощью мангуста. Но соответствующие встроенные документы: 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, но я неспособный к извлечению того, кто встроен в мангуст.
Я также пробовал без вложенного встроенного документа Spell, который создает ту же проблему.
EDIT
@pat Вы правы. Если я поместил все схемы непосредственно в один и тот же файл (основной пример app.js для примера) с правильным порядком, он работает.
Дело в том, что я хотел бы как можно больше сохранить каждую модель в отдельных файлах (они будут расти много).
Например, моя модель пользователя содержится в файле под названием models/user.js, а должен быть доступен с использованием module.exports
, как указано выше.
Но, когда я пытаюсь связать свою модель с mongoose в другом файле: mongoose.model('User', require('./models/user'));
метод поиска mongoose возвращает неопределенные встроенные документы.
Есть ли у вас какие-либо идеи о том, как правильно хранить монгольские модели в отдельных файлах?
Спасибо. Мои проблемы возникли из-за проблемы с зависимостями, а также из-за плохой структуры файлов. Я, наконец, закончил, присоединившись к моим моделям ObjectIds вместо встроенных документов, которые, по-видимому, лучше соответствуют моим потребностям. –