【问题标题】:Trouble using mongoose 'Populate'使用猫鼬“填充”时遇到问题
【发布时间】:2020-02-23 00:21:12
【问题描述】:

早安,

所以我似乎在用 Node.js 和 Mongoose 填充我的字段时遇到了问题。它只是打开一个空白数组:

结果:(JSON)

[
    {
        "courseassignments": [],
        "_id": "5db56ceb4cc2c92824ae2651",
        "name": "Garibaldi",
        "website": "www.garibaldi.org.uk",
        "__v": 0
    },
    {
        "courseassignments": [],
        "_id": "5db56d074cc2c92824ae2652",
        "name": "Kirk Hallam",
        "website": "www.kirkhallamacademy.co.uk",
        "__v": 0
    }
]

下面是我使用调用填充函数的代码,以及我用于每个数据的模型。这很奇怪。

*school.js(模型)*

// Require modules within our file:
const mongoose = require('mongoose')

const schoolSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true,
        unique: true,
        trim: true
    },
    website: {
        type: String,
        required: true,
        trim: true
    },
    logo: {
        type: Buffer
    },
    courseassignments: [{
        type: mongoose.Schema.Types.ObjectID, 
        ref: 'CourseAssignment'
    }]
})

// Export the user to use within other files:
const school = mongoose.model('School', schoolSchema)
module.exports = school

courseassignment.js(模型)

// Require modules within our file:
const mongoose = require('mongoose')

const courseAssignmentSchema = new mongoose.Schema({
    school: {
        type: mongoose.Schema.Types.ObjectID,
        required: true,
        ref: 'School'
    },
    course: {
        type: mongoose.Schema.Types.ObjectID,
        required: true,
        ref: 'Course'
    }
})

// Export the user to use within other files:
const courseAssignment = mongoose.model('CourseAssignment', courseAssignmentSchema)
module.exports = courseAssignment

* 获取数据的代码:(在 app.js 中)*

router.get('/school', async (req, res) => {

    const schools = await School.find({}).populate({ path: 'courseassignments' })
    res.send(schools)

})

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    我会从 School 模型中删除 courseassigment 引用,并会利用虚拟填充。

    以下是步骤:

    • school.js(学校模型 - 如您所见,我删除了课程分配参考,并添加了虚拟功能选项)
    const mongoose = require('mongoose')
    
    const schoolSchema = new mongoose.Schema({
        name: {
            type: String,
            required: true,
            unique: true,
            trim: true
        },
        website: {
            type: String,
            required: true,
            trim: true
        },
        logo: {
            type: Buffer
        }
    }, {
        toJSON: { virtuals: true },
        toObject: { virtuals: true }
    })
    
    schoolSchema.virtual("courseassignments", {
        ref: "CourseAssignment",
        foreignField: "school",
        localField: "_id"
    })
    
    const school = mongoose.model('School', schoolSchema)
    module.exports = school
    
    

    此时,当您点击学校端点时,您的响应将是这样的。 (我只展示了一个简短的项目。)

    [
        {
            "_id": "5db5a809cfc9951770d5078a",
            "name": "school 1",
            "website": "school 1 website",
            "__v": 0,
            "courseassignments": [
                {
                    "_id": "5db5a892cfc9951770d50790",
                    "school": "5db5a809cfc9951770d5078a",
                    "course": "5db5a847cfc9951770d5078d",
                    "__v": 0
                },
                {
                    "_id": "5db5a89ccfc9951770d50791",
                    "school": "5db5a809cfc9951770d5078a",
                    "course": "5db5a851cfc9951770d5078e",
                    "__v": 0
                },
                {
                    "_id": "5db5a8a1cfc9951770d50792",
                    "school": "5db5a809cfc9951770d5078a",
                    "course": "5db5a858cfc9951770d5078f",
                    "__v": 0
                }
            ],
            "id": "5db5a809cfc9951770d5078a"
        },
        ...
        ...
    ]
    
    

    如果您还想访问课程名称(我认为这很好),

    • courseassigment.js
    const mongoose = require('mongoose')
    
    const courseAssignmentSchema = new mongoose.Schema({
        school: {
            type: mongoose.Schema.Types.ObjectID,
            required: true,
            ref: 'School'
        },
        course: {
            type: mongoose.Schema.Types.ObjectID,
            required: true,
            ref: 'Course'
        }
    }, {
        toJSON: { virtuals: true },
        toObject: { virtuals: true }
    })
    
    courseAssignmentSchema.pre(/^find/, function (next) {
    
        this.populate({
            path: 'course'
        });
        next();
    });
    
    
    // an index may be required like this
    //courseAssignmentSchema.index({ school: 1, course: 1 }, { unique: true });
    
    const courseAssignment = mongoose.model('CourseAssignment', courseAssignmentSchema)
    module.exports = courseAssignment
    
    

    结果将包含与课程相关的字段,例如课程名称。

    [[
        {
            "_id": "5db5a809cfc9951770d5078a",
            "name": "school 1",
            "website": "school 1 website",
            "__v": 0,
            "courseassignments": [
                {
                    "_id": "5db5a892cfc9951770d50790",
                    "school": "5db5a809cfc9951770d5078a",
                    "course": {
                        "_id": "5db5a847cfc9951770d5078d",
                        "name": "course 1",
                        "__v": 0
                    },
                    "__v": 0,
                    "id": "5db5a892cfc9951770d50790"
                },
                {
                    "_id": "5db5a89ccfc9951770d50791",
                    "school": "5db5a809cfc9951770d5078a",
                    "course": {
                        "_id": "5db5a851cfc9951770d5078e",
                        "name": "course 2",
                        "__v": 0
                    },
                    "__v": 0,
                    "id": "5db5a89ccfc9951770d50791"
                },
                {
                    "_id": "5db5a8a1cfc9951770d50792",
                    "school": "5db5a809cfc9951770d5078a",
                    "course": {
                        "_id": "5db5a858cfc9951770d5078f",
                        "name": "course 3",
                        "__v": 0
                    },
                    "__v": 0,
                    "id": "5db5a8a1cfc9951770d50792"
                }
            ],
            "id": "5db5a809cfc9951770d5078a"
        },
        ...
        ...
    ]
    

    文档:

    https://mongoosejs.com/docs/tutorials/virtuals.html

    https://mongoosejs.com/docs/populate.html#populate-virtuals

    【讨论】:

      猜你喜欢
      • 2016-09-18
      • 1970-01-01
      • 2023-03-18
      • 2017-01-29
      • 2018-06-01
      • 1970-01-01
      • 2022-01-04
      • 2015-07-13
      • 2016-10-10
      相关资源
      最近更新 更多