无法使用猫鼬“ Populate”

时间:2019-10-27 11:33:34

标签: javascript node.js mongodb mongoose

早上好

所以我似乎在用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
    }
]

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

* 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)

})

1 个答案:

答案 0 :(得分:1)

我将从School模型中删除课程参考,并利用虚拟填充。

因此,请按以下步骤操作:

  • 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