首页 > 解决方案 > 如何在 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, default: 0 },
    type3Count: { type: Number, default: 0 },
  },

  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 中?

标签: javascriptnode.jsmongodbmongooseschema

解决方案


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

找到文档,然后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


推荐阅读