2012-06-14 3 views
1

Я строю игру с 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 возвращает неопределенные встроенные документы.

Есть ли у вас какие-либо идеи о том, как правильно хранить монгольские модели в отдельных файлах?

ответ

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

Это будет сохранять свой заказ.

Примечание: поддоны действительно не нужны, чтобы быть моделями, поскольку модели сопоставляются с коллекциями, но пока вы не вызываете save непосредственно на своих поддогах, они не будут сохранены в отдельной коллекции в db.

+0

Спасибо. Мои проблемы возникли из-за проблемы с зависимостями, а также из-за плохой структуры файлов. Я, наконец, закончил, присоединившись к моим моделям ObjectIds вместо встроенных документов, которые, по-видимому, лучше соответствуют моим потребностям. –

1

Пользовательская схема должна быть объявлена ​​после Характер и заклинание, я считаю.

+0

Спасибо за ваш ответ, это помогло. Но я хотел бы сохранить модели в отдельных файлах, я отредактировал свой вопрос. –