#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
);