如何在MongoDB中保存数据?并非一次就所有字段

问题描述

我已经创建了一个架构来存储用户详细信息和一些有关其测试的信息。

const mongoose = require("mongoose");
const schema = mongoose.Schema;

const userSchema = new schema({
  name: { type: String },gender: { type: String },stream: { type: String },email: {
    type: String,required: true,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])?/,},verified: { type: Boolean,default: false },password: { type: String,required: true },// For premium Calculations
  test: {
    type1Count: { type: Number,default: 0 },type2Count: { type: Number,type3Count: { type: Number,testCompleted: [
    {
      testId: { type: String },testDate: { type: Number },testTypeNumber: { type: Number },testTypeName: { type: Number },testDurationInMinutes: {type: Number},listofQuestionId: [{ type: String }],listofCorrectAnswer: [{ type: Number }],listofAnswerByUser: [{ type: Number }],totalNumberOfQuestion: { type: Number },numberOfAttemptedQuestion: { type: Number },numberOfUnattemptedQuestion: { type: Number },numberOfCorrectAnswer: { type: Number },numberOfWrongAnswer: { type: Number },marksObtained: {type: Number},isTestCompleted : {type: Boolean,default: false}
    },]
});

module.exports = mongoose.model("User",userSchema);

现在,我不会一次保存所有数据, 首先,我将仅保存其注册部分,例如名称,电子邮件密码注册用户代码...

const newUser = new User({
        name,email,password,});
      const salt = await bcrypt.genSalt(10);
      newUser.password = await bcrypt.hash(password,salt);

      await newUser.save();

现在在我的数据库中创建了一个用户。 现在我想保存这些数据... //有一些逻辑,但是数据还可以。.

var paper = {
      testId: Object.keys(user.testCompleted).length +1,// I choose normal serialise Number starting from 1
      testDate: Date.Now(),testTypeNumber: type,testTypeName: testList[type - 1]["testName"],testDurationInMinutes: testList[type - 1]["testDurationInMinutes"],weightageOfQuestion: list[type - 1],totalNumberOfQuestion: list[type - 1]["physics"] + list[type - 1]["chemistry"] + list[type - 1]["biology"],listofQuestionId: arrayOfQuestion,listofCorrectAnswer: arrayOfAnswer,};

现在我已经创建了一个用户 在稍后的阶段中,我必须将纸张数据保存在testCompleted []组中,该组是一组对象

并且在以后的阶段中,我必须将该数据存储在同一testCompleted []组中,

const data = {
    totalNumberOfQuestion: totalNumberOfQuestion,numberOfAttemptedQuestion: attempt,numberOfUnattemptedQuestion: totalNumberOfQuestion - attempt,numberOfCorrectAnswer: attempt - wrong,numberOfWrongAnswer: wrong,marksObtained: marks,isTestCompleted: true
  }

请帮助我,如何随时在mongodb中部分保存数据?

解决方法

2种更新文档内部数组的方法:

找到文档,然后使用push()将其添加到数组中,然后调用.save()

const userToUpdate = await User.find({_id:userId})
userToUpdate.testCompleted.push(data)
userToUpdate.save()

使用findOneAndUpdate()update()$push

User.update(
    { _id: userId },{ $push: { testCompleted: data } },done
);

参考:using_nodejs_and_mongoose_to_update_array