繁体   English   中英

如何更新nodejs中的嵌套子数组,mongodb api

[英]How to update a nested sub array in nodejs, mongodb api

我正在为学生记录构建 Nodejs/Express 和 MongoDb 后端 API,我需要有关如何更新数据中的子字段的帮助。 我在根目录下的 model 目录中的 Student.js 文件中有以下代码。

const mongoose = require('mongoose');

const StudentSchema = mongoose.Schema({
    name: {
        type: String,
        require: true
    },
    class: {
        type: String,
        require: true
    },
    subject: [{
        subjectname: {
            type:String,
        },
        assessment: [{
            type: {
                type: String,
                require: true
            }, 
            score: {
                type: Array,
                require: true
            }, 
            total: {
                type: Array,
                require: true
            }, 
        }],
    }],  
    gendar: {
        type: String,
        require: true
    },   
    birthday: {
        type: Date,
    },
});

module.exports = mongoose.model('Students', StudentSchema);

我的路线文件中也有以下代码;

const express = require('express');
const router = express.Router();

const Student = require('../models/Student.js');


//GET BACK ALL THE STUDENTS
router.get('/', async (req, res) => {
    try{
        const students = await Student.find();
            res.json(students);
    }   catch(err){
            res.json({message: err});
    }
});

//GET BACK ALL THE ASSESSMENT SCORE
router.get('/assessment/score', async (req, res) => {
    try{
        const students = await Student.find({},{"subject.assessment.score":1});
            res.json(students);
    }   catch(err){
            res.json({message: err});
    }
});
...
...
// ADD A STUDENT
router.post('/', async (req, res) => {
    const student = new Student({
        name: req.body.name,
        class: req.body.class,
        subject: [{
            subjectname: req.body.subjectname,
            assessment: [{
                type: req.body.type,
                score: req.body.score,
                total: req.body.total,
            }],
        }],
        gendar: req.body.gendar,
        birthday: req.body.birthday,
    });
    try{
    //console.log(req.body);
    const savedStudent = await student.save()
    res.json(savedStudent);
    }catch(err){
        res.json({message: err});
    }
});

上面代码中的请求在使用 postman 进行测试时可以正常工作,但是当我尝试为学生更新正在评估的分数和总字段时,它不起作用。 以下是我到目前为止尝试过的代码;

//UPDATE A STUDENT ASSESSMENT
router.post('assessment/:studentId/:subjectId:/assessId', async (req, res) => {
    try{
    const updatedStudent = await Student.findByIdAndUpdate({ _id: req.params.studentId }, 
        { "subject":{
            _id:req.params.subjectId,
            $push: { 
                "assessment": {
                    _id:req.params.assessId,
                    score: req.body.score,
                    total: req.body.total,
                },
            }  
        } }   
        );
        res.json(updatedStudent);
            }catch (err) {
                res.json({ message: err });
    }
});

在代码中,我尝试使用各个字段的子 _id 更新分数和总分。 我不知道这是否是关于它的 go 。 任何更新分数和总分的帮助将不胜感激。 谢谢。

据我了解,您想在学生文档中的特定主题内推送新的评估(如果我错了,请纠正我)。 好吧,您需要稍微更改查询选择器以及要推送的字段。

const updatedStudent = await Student.findByIdAndUpdate({ _id: req.params.studentId, 'subject._id' : req.params.subjectId }, 
    { $push: { 
            "subject.$.assessment": {
                _id: req.params.assessId,
                score: req.body.score,
                total: req.body.total,
            },
        }  
    } }   
    );
    res.json(updatedStudent);
        }catch (err) {
            res.json({ message: err });
}

我认为这样它应该在学生文档中推动你的主题内的新评估(不是 100% 肯定,因为我没有尝试过)。 但是,如果您继续纠结于这个问题,您可能需要阅读一些有关数组更新运算符的文档: https://docs.mongodb.com/manual/reference/operator/update-array/

我使用下面的代码解决了这个问题,更新了数据中的分数、总分和评估子字段的类型;

router.post('/assessupdate_1/:studentId', async (req, res) => {
    try{
    const updatedAssessment = await Student.findOneAndUpdate(
        { _id: req.params.studentId }, 
        {$push: 
            {"subject.0.assessment.0.total":req.body.total,
            "subject.0.assessment.0.score":req.body.score,
            "subject.0.assessment.0.type":req.body.type,}
        },          
        );
        res.json(updatedAssessment);
            }catch (err) {
                res.json({ message: err });
    }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM