【问题标题】:i am unable to save mongodb data in array of documents我无法将 mongodb 数据保存在文档数组中
【发布时间】:2020-08-24 16:09:30
【问题描述】:

我已经创建了一个 Schema 来存储用户详细信息和一些关于它的测试的信息。

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: 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
           }
         }
       }
     )

现在,这将导致像这样在数据库中多次插入数据......当我点击 Routes 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
}

现在,如您所见,在我的用户模型中,我的 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
         }
       }
     }
   )

【问题讨论】:

    标签: javascript node.js mongodb schema mongoose-schema


    【解决方案1】:

    为了更新特定索引处的数组元素,您可以将positional-operator$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
                }
    
            }
    
        }
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      相关资源
      最近更新 更多