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



我正在为学生记录构建Nodejs/Express和MongoDb后端API,我需要关于如何更新数据中的子字段的帮助。下面的代码在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});
}
});

当用poster测试时,上面代码中的请求可以很好地工作,但当我试图更新学生的分数和评估中的总字段时,它不起作用。以下是我迄今为止尝试过的代码;

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

在代码中,我试图使用各个字段的sub_id来更新分数和总分。我不知道这是不是该怎么做。任何帮助更新分数和总分的人都将不胜感激。谢谢

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

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

最新更新