使用外部文件中的模型填充Mongoose模式属性

时间:2016-01-24 05:42:35

标签: node.js mongodb mongoose mongoose-populate odm

我在Mongoose模式中尝试populate一个属性,该模式引用另一个外部模型/模式中的属性。

当两个模型/模式和查询都在同一个文件中时,我可以让Mongoose填充/引用工作,但我有我的架构设置,所以模型都在 / models中的自己的文件中目录, /models/index.js 将返回模型对象(显然 index.js 知道要排除自己)

我遇到的问题是,因为Schemas / Models都在他们自己的文件中,当我指定模型名称作为参考时,它不起作用。我尝试将该特定模型本身加载到另一个模型中,这也失败了。

仅供参考:我是MongoDB和Mongoose的新手,所以以下代码非常粗糙,主要是我在学习过程中

群组模型

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

正如您在帐户模型中看到的那样,我尝试将组模型作为 _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 个答案:

答案 0 :(得分: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 ) => {