#javascript #node.js #mongodb #schema #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: Number },
testDate: { type: Number },
testTypeNumber: { type: Number },
testTypeName: { type: String },
testDurationInMinutes: {type: Number},
listOfQuestionId: [{ type: String }],
listOfCorrectAnswer: [{ type: Number }],
listOfAnswerByUser: [{ type: Number }],
totalNumberOfQuestion: { type: Number, default: 0 },
numberOfAttemptedQuestion: { type: Number, default: 0 },
numberOfUnattemptedQuestion: { type: Number, default: 0 },
numberOfCorrectAnswer: { type: Number, default: 0 },
numberOfWrongAnswer: { type: Number, default: 0 },
marksObtained: {type: Number, default: 0 },
isTestCompleted : {type: Boolean, default: false}
},
]
});
module.exports = mongoose.model("User", userSchema);
Теперь я могу сохранить половину данных в массиве testCompletd из этого кода …
User.findOneAndUpdate(
{ _id: user._id}, // for Verification
{ $push:
{ testCompleted:
{
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
}
}
}
)
Теперь это приведет к многократным вставкам данных в базу данных, подобным этому…когда я нажимаю на маршруты 2 раза … и это работает нормально..
{
"_id" : ObjectId("5f436c5bf183fb93266a5574"),
"test" : {
"type1Count" : 0,
"type2Count" : 0,
"type3Count" : 0
},
"verified" : false,
"name" : "prince",
"email" : "kumar@gmail.com",
"password" : "$2a$10$RCVA2YNzKPjTJKDJhCfeZuqw83GnruQ4s9/7EhrkOs4JpuUVG2j9C",
"testCompleted" : [
{
"listOfQuestionId" : [
"5f3fc58aec2c8d59e5258625",
"5f3fc591ec2c8d59e5258636",
"5f3fc58cec2c8d59e525862a",
"5f3fc593ec2c8d59e525863a",
"5f3fc57bec2c8d59e5258617",
"5f3fc588ec2c8d59e5258622",
"5f3fc57cec2c8d59e5258619",
"5f3fc58aec2c8d59e5258626",
"5f3fc588ec2c8d59e5258621",
"5f3fc57dec2c8d59e525861a",
"5f3fc55cec2c8d59e52585f4",
"5f3fc56cec2c8d59e525860d",
"5f3fc55aec2c8d59e52585f1",
"5f3fc561ec2c8d59e52585fa",
"5f3fc568ec2c8d59e5258607",
"5f3fc55bec2c8d59e52585f2",
"5f3fc570ec2c8d59e5258614",
"5f3fc56fec2c8d59e5258612",
"5f3fc565ec2c8d59e5258601",
"5f3fc566ec2c8d59e5258603",
"5f3fc526ec2c8d59e52585a4",
"5f3fc545ec2c8d59e52585d2",
"5f3fc54dec2c8d59e52585e1",
"5f3fc54cec2c8d59e52585e0",
"5f3fc53fec2c8d59e52585c6",
"5f3fc549ec2c8d59e52585d9",
"5f3fc52eec2c8d59e52585ae",
"5f3fc52fec2c8d59e52585af",
"5f3fc554ec2c8d59e52585ed",
"5f3fc53bec2c8d59e52585c0",
"5f3fc52bec2c8d59e52585ac",
"5f3fc52eec2c8d59e52585ad",
"5f3fc542ec2c8d59e52585cb",
"5f3fc527ec2c8d59e52585a5",
"5f3fc54eec2c8d59e52585e3",
"5f3fc536ec2c8d59e52585b9",
"5f3fc546ec2c8d59e52585d4",
"5f3fc53dec2c8d59e52585c3",
"5f3141ed72d27d9df229dfe9",
"5f3fc54dec2c8d59e52585e2"
],
"listOfCorrectAnswer" : [
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
4,
1
],
"listOfAnswerByUser" : [],
"totalNumberOfQuestion" : 40,
"numberOfAttemptedQuestion" : 0,
"numberOfUnattemptedQuestion" : 0,
"numberOfCorrectAnswer" : 0,
"numberOfWrongAnswer" : 0,
"marksObtained" : 0,
"isTestCompleted" : false,
"_id" : ObjectId("5f436c6ef183fb93266a5575"),
"testId" : 1,
"testDate" : 1598254190194.0,
"testTypeNumber" : 1,
"testTypeName" : "Minor",
"testDurationInMinutes" : 30
},
{
"listOfQuestionId" : [
"5f3fc58dec2c8d59e525862b",
"5f3fc586ec2c8d59e525861f",
"5f3fc58bec2c8d59e5258628",
"5f3fc58dec2c8d59e525862c",
"5f3fc58aec2c8d59e5258626",
"5f3fc592ec2c8d59e5258638",
"5f3fc591ec2c8d59e5258634",
"5f3fc590ec2c8d59e5258633",
"5f3fc591ec2c8d59e5258636",
"5f3fc58fec2c8d59e5258630",
"5f3fc562ec2c8d59e52585fd",
"5f3fc55eec2c8d59e52585f7",
"5f3fc565ec2c8d59e5258602",
"5f3fc570ec2c8d59e5258614",
"5f3fc571ec2c8d59e5258615",
"5f3fc55cec2c8d59e52585f3",
"5f3fc55aec2c8d59e52585f0",
"5f3fc56fec2c8d59e5258613",
"5f3fc55bec2c8d59e52585f2",
"5f3fc56eec2c8d59e5258611",
"5f3fc54eec2c8d59e52585e3",
"5f3fc549ec2c8d59e52585da",
"5f3fc53eec2c8d59e52585c5",
"5f3fc521ec2c8d59e52585a0",
"5f3fc53dec2c8d59e52585c3",
"5f3fc528ec2c8d59e52585a6",
"5f3fc538ec2c8d59e52585bc",
"5f3fc542ec2c8d59e52585cb",
"5f3fc528ec2c8d59e52585a7",
"5f3fc53cec2c8d59e52585c1",
"5f3fc543ec2c8d59e52585cd",
"5f3fc552ec2c8d59e52585eb",
"5f3fc543ec2c8d59e52585ce",
"5f3fc534ec2c8d59e52585b5",
"5f3fc53cec2c8d59e52585c2",
"5f3fc54cec2c8d59e52585df",
"5f3fc541ec2c8d59e52585ca",
"5f3fc542ec2c8d59e52585cc",
"5f3fc548ec2c8d59e52585d7",
"5f3fc549ec2c8d59e52585d9"
],
"listOfCorrectAnswer" : [
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1
],
"listOfAnswerByUser" : [],
"totalNumberOfQuestion" : 40,
"numberOfAttemptedQuestion" : 0,
"numberOfUnattemptedQuestion" : 0,
"numberOfCorrectAnswer" : 0,
"numberOfWrongAnswer" : 0,
"marksObtained" : 0,
"isTestCompleted" : false,
"_id" : ObjectId("5f436c7bf183fb93266a5576"),
"testId" : 2,
"testDate" : 1598254203550.0,
"testTypeNumber" : 1,
"testTypeName" : "Minor",
"testDurationInMinutes" : 30
}
],
"__v" : 0
}
Теперь, как вы можете видеть, в моей пользовательской модели у меня есть поле others также в моем разделе testCompleted…Нравится..
listOfAnswerByUser: listOfAnswerByUser,
totalNumberOfQuestion: totalNumberOfQuestion,
numberOfAttemptedQuestion: attempt,
numberOfUnattemptedQuestion: totalNumberOfQuestion - attempt,
numberOfCorrectAnswer: attempt - wrong,
numberOfWrongAnswer: wrong,
marksObtained: marks,
isTestCompleted: true
Теперь я хочу сохранить эти данные в определенном индексе этого массива, но это не работает, пожалуйста, помогите мне… Я пытаюсь так, но ЭТО НЕ РАБОТАЕТ.
User.findOneAndUpdate(
{ _id: user._id, "testCompleted.testId": 0}, // for Verification // 5f42cd4cf3a7458ddd4f5013
{ $push:
{ testCompleted:
{
testId: testId,
listOfAnswerByUser: listOfAnswerByUser,
totalNumberOfQuestion: totalNumberOfQuestion,
numberOfAttemptedQuestion: attempt,
numberOfUnattemptedQuestion: totalNumberOfQuestion - attempt,
numberOfCorrectAnswer: attempt - wrong,
numberOfWrongAnswer: wrong,
marksObtained: marks,
isTestCompleted: true
}
}
}
)
Ответ №1:
Чтобы обновить элемент массива по определенному индексу, вы можете использовать позиционный оператор в сочетании с $set
:
User.findOneAndUpdate(
{_id: user._id, "testCompleted.testId": "<testId you want to update>"},
{
$set: {
"testCompleted.$": {
numberOfAttemptedQuestion: attempt,
numberOfUnattemptedQuestion: totalNumberOfQuestion - attempt,
numberOfCorrectAnswer: attempt - wrong,
numberOfWrongAnswer: wrong,
marksObtained: marks,
isTestCompleted: true
}
}
}
)