簡體   English   中英

Mongoose updateMany 用於數組數組

[英]Mongoose updateMany for array of array

目前,我正在做一個關於大學學術管理的項目,每學期學生都會獲得培訓分數,如果有人低於50/100,他們會收到一封警告郵件。 我使用mongoose,即mongo atlas來存儲數據,后端使用expressjs,我創建了一個名為“classes”的模型來定義類的信息如下:

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,
    required: true,
    unique: true
  },
  classname: {
    type: String,
    require: true
  },
  gender: {
    type: String,
    required: true,
    enum: ['Male', 'Female', 'No Record'],
    default: 'No Record'
  },
  birthday: {
    type: String
  },
  vnumail: {
    type: String,
    unique: true,
    required: 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])?/
  },
  vnumail: {
    type: String,
    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,
        required: true
      },
      schoolYear: {
        type: String,
        required: true
      },
      semester: {
        type: String,
        required: true,
        enum: ['1', '2'],
        default: '1'
      },
      classification: {
        type: String,
        required: true,
        enum: [
          'Excellent',
          'Good',
          'Intermediate',
          'Average',
          'Weak',
          'Fail',
          'No Record'
        ],
        default: 'No Record'
      }
    }
  ],
  scoreList: [
    {
      score: {
        type: Number,
        required: true
      },
      subjectCode: {
        type: String,
        required: true
      },
      subjectName: {
        type: String,
        required: true
      }
    }
  ],
  receiveScholarship: [
    {
      scholarshipName: {
        type: String,
        required: true
      },
      value: {
        type: Number,
        required: true
      }
    }
  ],
  prizeList: [
    {
      constestName: {
        type: String,
        required: true
      },
      ranking: {
        type: Number,
        required: true
      }
    }
  ],
  scienceContestPrizeList: [
    {
      constestName: {
        type: String,
        required: true
      },
      ranking: {
        type: Number,
        required: true
      }
    }
  ],
  wentAbroad: [
    {
      country: {
        type: String
      },
      time: {
        type: Date
      }
    }
  ],
  tookTheTest: [
    {
      testName: {
        type: String,
        required: true
      },
      ranking: {
        type: Number,
        required: true
      }
    }
  ],
  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,
          schoolYear,
          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, res, next) => {
  const { data } = req

  var studentList = []

  data.forEach((student, index) => {
    var {
      fullname,
      code,
      birthday,
      classname,
      accademicTrainningList
    } = student

    studentList.push({
      fullname,
      birthday,
      classname,
      code,
      vnumail: code + '@vnu.edu.vn',
      classname,
      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 地圖集上類 mongo 圖集 學生 mongo 圖集

但是正如你所看到的,“學生”模型中的“academicTrainningList”屬性是一個數組,我剛剛添加了第一個,現在我想為2016年第二學期和下學期添加更多項目,我將不得不更新許多, 輸入將是一個學生列表相同的 xlsx 文件,分數會有所不同,但我不知道語法會是什么樣子,我是一個完全的新手和自學成才的人,感謝您的時間通讀這篇文章並花時間幫助我,這對我很有意義,祝你有美好的一天

如果你想更新很多資源,你可以 .find(query) 資源,然后為每個資源:

forEach((doc)=>{doc.academicTrainingList.push(NEW_ITEM)}

我不知道您的 .xlsx 文件背后的邏輯,但您可以在表中搜索您的項目 ID 以找到正確的 NEW_ITEM 以推送到數組

暫無
暫無

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

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