[英]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.