簡體   English   中英

使用 mongoose '填充'時遇到問題

[英]Trouble using mongoose 'Populate'

早上好,

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

下面是我使用調用填充 function 的代碼,以及我用於每個數據的模型。 這很奇怪。

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

})

我將從 School model 中刪除課程分配參考,並利用虛擬填充。

所以這里是步驟:

  • school.js(學校 model - 如您所見,我刪除了課程分配參考,並添加了虛擬功能選項)
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"
    },
    ...
    ...
]

如果您還想訪問課程名稱(我認為這很好),

  • 課程分配.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM