0

Ok so i have a schema as follows

const newUserSchema = new mongoose.Schema({
  name: {
    type: String,
    required: [true, "Check Data Entry, no name specified"]
  },
  email: {
    type: String,
    required: [true, "Check Data Entry, no email specified"]
  },
  password: {
    type: String,
    // required: [true, "Check Data Entry, no password specified"]
  },
  kids: []
});

then I created new kid schema

const newKidSchema = new mongoose.Schema({
  name: {
    type: String,
    required: [true, "Check Data Entry, no name specified"]
  },
  age: {
    type: Number,
    required: [true, "Check Data Entry, no age specified"]
  },
  gender: {
    type: String,
    required: [true, "Check Data Entry, no level specified"]
  },
  experiencePoints: {
    type: Number
  },
  gameScores: [],
  learningResources: [],
  progress: [],
  engPlanner: [],
  urduPlanner: [],
  mathPlanner: [],
  dates: [],
  dayTaskLength:[]
});
const learningResources = new mongoose.Schema({
  name: {
    type: String,
    required: [true, "Check Data Entry, no name specified"]
  },
  subject: {
    type: String,
    required: [true, "Check Data Entry, no subject specified"]
  },
  status: {
    type: Boolean,
    required: [true, "Check Data Entry, no status specified"]
  },
  learningTime: {
    type: String,
    required: [true, "Check Data Entry, no time specified"]
  }
});

const gameScoreSchema = new mongoose.Schema({
  subject: {
    type: String,
    required: [true, "Check Data Entry, no subject specified"]
  },
  gameTitle: {
    type: String,
    required: [true, "Check Data Entry, no Game Title specified"]
  },
  gameScore: {
    type: Number,
    required: [true, "Check Data Entry, no Game Score specified"]
  },
  gameTime: {
    type: String,
    required: [true, "Check Data Entry, no Game Time specified"]
  },
  experiencePoints: {
    type: Number,
    required: [true, "Check Data Entry, no Experience Points specified"]
  },
  gameStatus: {
    type: Boolean,
    required: [true, "Check Data Entry, no Game Status specified"]
  }
});
const progressSchema = new mongoose.Schema({
  engGamesProgress:{
    type: Number,
    required: [true]
  },
  mathGamesProgress:{
    type: Number,
    required: [true]
  },
  urduGamesProgress:{
    type: Number,
    required: [true]
  },
  engLrProgress:{
    type: Number,
    required: [true]
  },
  mathLrProgress:{
    type: Number,
    required: [true]
  },
  urduLrProgress:{
    type: Number,
    required: [true]
  }
});

And this is the code where i receieve the gameScore data,

app.post("/add-game-score", (req, res) => {
  // New game
  const newSubject = req.body.subject;
  const newTitle = req.body.gameTitle;
  const newGameScore = req.body.gameScore;
  const newGameTime = req.body.gameTime;
  const newExperiencePoints = req.body.experiencePoints;
  const newgameStatus = req.body.gameStatus;
  User.findOne({
    email: signedInUser
  }, function(err, foundList){
    if(!err){
      if(foundList){
        kids = foundList.kids;
        const newgame = new GameScore({
            subject: newSubject,
            gameTitle: newTitle,
            gameScore: newGameScore,
            gameTime: newGameTime,
            experiencePoints: newExperiencePoints,
            gameStatus: newgameStatus
        });
        // var new_kids = [];
        kids.forEach(kid => {
          if(kid._id == kidProfileCurrentlyIn.kidID){
            kid.gameScores.push(newgame)
            console.log("Bellow are all game scores");
            console.log(kid.gameScores);
          }
          // new_kids.push(kid);
        });

        gameKidsArray = kids;

      User.findOneAndUpdate({
        email: signedInUser
      }, {
        kids:gameKidsArray
      }, (err, foundList) => {
        if(foundList){
          console.log(gameKidsArray);
          console.log("Added Game Successfully");
          console.log(foundList);
        }
      });
      }
    }
  });
});

Now the problem is that, when i console.log kid.gameScores array I find my newly added score in it, but when I console.log(kids) then it doesn't get updated. In mongodb Atlas i cant find new game scores. But the problem is once a while they get entered into the database. I m so confused as to why this problem is occurring. I know that I m sending right data and it is being updated in kid.gameScores array but "Kid" doesn't get updated with new gamescore array.

User.findOneAndUpdate({
        email: signedInUser
      }, {
        kids:gameKidsArray
      }

this is where i m updating my arrays. Any help.

  • in present code you do `gameKidsArray = kids`, which basically is your original kids array. Also better create new arrays instead of messing with arrays coming from mongoose models. – Nikita Mazur Jun 01 '21 at 10:28
  • The problem is that gamesKidsArray do have the newly added values, but kids wont update. Whats the problem, as i know it has some arrays problem i will resolve it. But why its not updating the array inside the User schema with new gamescores. – Egoiistic Prince Jun 01 '21 at 10:45

1 Answers1

1

If you want to make sure that the findOneAndUpdate successfully updated your record, you need to add { new: true } in the last parameter. See here.

So you should update your codes to be

User.findOneAndUpdate({
        email: signedInUser
      }, {
        kids:gameKidsArray
      }, {
        new: true
      }
  • Ok by doing this i can see in my foundlist that there is an object inside gamesScores. But when i go back to see collections in mongoDB atlas I can't find it – Egoiistic Prince Jun 01 '21 at 14:56