如何解决猫鼬更新许多为数组
目前,我正在研究大学的学术管理项目,每学期的学生都会获得培训分数,如果低于50/100的人会收到警告电子邮件。我使用mongoose(即mongo地图集)存储数据,将expressjs用于后端,我创建了一个名为“类”的模型来定义类信息,如下所示:
const mongoose = require('mongoose')
const classSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,consultant: {
type: mongoose.Schema.Types.ObjectId,ref: 'Consultant',required: true
},classname: {
type: String,required: true,unique: true
},studentList: [
{
code: {
type: String,required: true
},fullname: {
type: String,required: true
}
}
]
})
const Class = mongoose.model('Class',classSchema)
module.exports = Class
这是我的学生模式:
const mongoose = require('mongoose')
const studentSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,fullname: {
type: String
},code: {
type: String,require: true
},gender: {
type: String,enum: ['Male','Female','No Record'],default: 'No Record'
},birthday: {
type: String
},vnumail: {
type: String,unique: true,match: /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/
},profileImage: {
type: String,default:
'https://kittyinpink.co.uk/wp-content/uploads/2016/12/facebook-default-photo-male_1-1.jpg'
},hometown: {
type: String
},accademicTrainningList: [
{
score: {
type: Number,schoolYear: {
type: String,semester: {
type: String,enum: ['1','2'],default: '1'
},classification: {
type: String,enum: [
'Excellent','Good','Intermediate','Average','Weak','Fail','No Record'
],default: 'No Record'
}
}
],scoreList: [
{
score: {
type: Number,subjectCode: {
type: String,subjectName: {
type: String,required: true
}
}
],receiveScholarship: [
{
scholarshipName: {
type: String,value: {
type: Number,prizeList: [
{
constestName: {
type: String,ranking: {
type: Number,scienceContestPrizeList: [
{
constestName: {
type: String,wentAbroad: [
{
country: {
type: String
},time: {
type: Date
}
}
],tookTheTest: [
{
testName: {
type: String,punishList: [
{
studentCode: {
type: mongoose.Schema.Types.ObjectId
}
}
]
})
studentSchema.pre('save',function (error,doc,next) {
if (error.name === 'MongoError' && error.code === 11000) {
next(new Error('There was a duplicate key error'))
} else {
next()
}
})
const Student = mongoose.model('Students',studentSchema)
module.exports = Student
然后我创建一条添加新类的路由,输入是一个.xlsx文件,我将提取该文件中的信息,并添加xlsx文件的属性并将其添加到数据库中。我使用xlsx-npm库提取信息并保存。该图像演示了我的输入文件
router.post(
'/',upload.single('excel'),extract_data,add_new_class,add_students_from_excel,add_parent_from_excel,add_user_from_excel
)
这是我用来提取信息的中间件:
const xlsx = require('xlsx')
const { formatClassname } = require('../../helpers')
exports.extract_data = (req,res,next) => {
let { file } = req
let workbook = xlsx.readFile(file.path)
const sheet_name_list = workbook.SheetNames
let { classname,schoolYear,semester } = req.body
data = []
sheet_name_list.forEach(sheet => {
let workSheet = workbook.Sheets[sheet]
let dataArr = xlsx.utils.sheet_to_json(workSheet)
dataArr.forEach(info => {
var fullname = info['Họ tên ']
var code = info['Mã SV ']
var birthday = info['Ngày sinh ']
var score = info['Điểm ']
data.push({
fullname,code,birthday,classname: formatClassname(classname),accademicTrainningList: {
score,semester,classification:
(score >= 90 && 'Excellent') ||
(score >= 80 && score < 90 && 'Good') ||
(score >= 70 && score < 80 && 'Intermediate') ||
(score >= 60 && score < 70 && 'Average') ||
(score >= 50 && score < 60 && 'Weak') ||
(score < 50 && 'Fail')
}
})
})
})
req.data = data
next()
}
然后在下一条路线中,我将许多插入到“学生”集合中:
exports.add_students_from_excel = async (req,next) => {
const { data } = req
var studentList = []
data.forEach((student,index) => {
var {
fullname,classname,accademicTrainningList
} = student
studentList.push({
fullname,vnumail: code + '@vnu.edu.vn',accademicTrainningList
})
})
Student.insertMany(studentList,{ ordered: false })
.then(docs => {
console.log('new students were inserted,reload the database')
next()
})
.catch(err => {
if (
(err.name === 'BulkWriteError' || err.name === 'MongoError') &&
err.code === 11000
) {
console.log('new students were inserted,reload the database')
next()
} else {
res.status(500).json({ err })
}
})
}
我成功了,我在模型“班级”中添加了有关新班级的数据,并在模型“学生”中添加了学生列表。这是输入数据图像,结果保存在mongo地图集上
但是正如您所看到的,“ student”模型中的“ academicTrainningList”属性是一个数组,我刚刚添加了第一个,现在我想在2016年下半年添加更多项目,下一个我将添加很多,输入的将是一个具有相同学生列表的xlsx文件,并且分数将有所不同,但是我不知道语法会是什么样,我是一个完整的新手并且是自学成才的,谢谢您有时间阅读这篇文章并花时间帮助我,这对我来说非常有意义,祝您有愉快的一天
解决方法
如果要更新许多资源,可以先查找(查询)资源,然后再查找每个资源:
forEach((doc)=>{doc.academicTrainingList.push(NEW_ITEM)}
我不知道您的.xlsx文件背后的逻辑,但是您可以在表中搜索项目ID来找到要推送到数组的正确NEW_ITEM
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。