2016-01-24 4 views
0

Im пытается присвоить populate свойство внутри схемы Mongoose, которая ссылается на свойство в другой внешней модели/схеме.Свойства схемы Mongoose с моделями во внешних файлах

я могу получить Mongoose населения/ссылающийся работу, когда две модели/схемы и запрос все в том же файле, но у меня есть мои настройки архитектуры, так что модели все в своих собственных файлах в пределах /модели каталог, и /models/index.js возвращает объект модели (очевидно, index.js знает, чтобы исключить себя)

Проблема Я бегу в, это так Schemas/модели все в своих файлах, когда я указываю имя модели как ссылку, она не работает. Я пытаюсь загрузить эту конкретную модель непосредственно внутри другой модели, и это также терпит неудачу.

FYI: Im достаточно новое для MongoDB и Mongoose, поэтому следующий код очень очень грубо, это в основном меня в процессе обучения

Group Модель

// models/group.js 
'use strict' 

module.exports = Mongoose => { 
    const Schema = Mongoose.Schema 

    const modelSchema = new Schema({ 
     name: { 
      type: String, 
      required: true, 
      unique: true 
     } 
    }) 

    return Mongoose.model(ModelUtils.getModelName(), modelSchema) 
} 

Расчетная модель

// models/account.js 
'use strict' 

module.exports = Mongoose => { 
    // I tried loading the specific model being referenced, but that doesn't work 
    const Group = require('./group')(Mongoose) 
    const Schema = Mongoose.Schema 

    const modelSchema = new Schema({ 
     username: { 
      type: String, 
      required: true, 
      unique: true 
     }, 
     _groups: [{ 
      type: Schema.Types.ObjectId, 
      ref: 'Group' 
     }] 
    }) 

    // Trying to create a static method that will just return a 
    // queried username, with its associated groups 
    modelSchema.statics.findByUsername = function(username, cb) { 
     return this 
      .findOne({ username : new RegExp(username, 'i') }) 
      .populate('_groups').exec(cb) 
    } 

    return Mongoose.model(ModelUtils.getModelName(), modelSchema) 
} 

Как вы можете видеть в модели счета, Im пытается ссылаться на модели группы как _groups элемента, а затем запрос для учетной записи при заполнении связанных с ними групп внутри modelSchema.statics.findByUsername статического метода ..

Основной файл приложения

// app.js 
const models = require('./models')(Mongoose) 

models.Account.findByUsername('jdoe', (err, result) => { 
    console.log('result',result) 

    Mongoose.connection.close() 
}) 
+1

Почему именно вам требуется модель группы в модели учета? Глядя на данный код, он не кажется необходимым. В чем цель «ModelUtils»? – qqilihq

+0

У меня на самом деле есть, что прокомментировал локально, это бросало ошибки. Я ** угадывал **, может быть, модель Accounts нуждалась в ней, поскольку на нее ссылались, но это был просто выстрел в темноте. – Justin

ответ

1

Я не ясно, каким образом ModelUtils.getModelName() реализуется. Я думаю, что проблема должна быть здесь, потому что она хорошо работает после того, как я меняю ваши коды ниже

// group.js 
return Mongoose.model('Group', modelSchema); 

// account.js 
return Mongoose.model('Account', modelSchema); 

// app.js 
const models = require('./models/account.js')(Mongoose); 

models.findByUsername('jdoe', (err, result) => { 
+0

'ModelUtils.getModelName()' просто получает имя файла и преобразует его из '/ models/account.js' в' Account'. Он просто возвращает строку ... как бы шляпа вызывала ошибку? [Имеет код для этого] (http://pastebin.com/tLerkVi5) – Justin

+0

Может быть, это как-то связано с '/ models/index.js', который загружает все модели? Heres, что файл: http://pastebin.com/D0r8bPpS – Justin

+0

+ zangw, похоже, работает, когда я заменяю 'ModelUtils.getModelName()' просто регулярной строкой ... Любая идея, почему это было бы? Эта функция просто возвращает строку ... Я не могу придумать причину, почему это будет проблемой, но, очевидно, это – Justin

Смежные вопросы