я не могу сохранить данные mongodb в массиве документов

#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
            }

        }

    }
)