Как сохранить данные в MongoDB? Не все поля за один раз

#javascript #node.js #mongodb #mongoose #schema

#javascript #node.js #mongodb #mongoose #схема

Вопрос:

Я создал схему для хранения сведений о пользователе и некоторой информации, касающейся его тестирования.

 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!#$%amp;'* /=?^_`{|}~-] (?:.[a-z0-9!#$%amp;'* /=?^_`{|}~-] )*@(?:[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 в любых точках?

Комментарии:

1. разделите разделы на отдельные модели. каждая модель должна ссылаться на текущего пользователя. существует тонна документации по этому вопросу, и я дважды отвечал на этот вопрос, если вы хотите просмотреть мои вопросы для примера

Ответ №1:

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