Объект MongoDB не обновляется

Я работаю над системой баз данных с использованием MongoDB. Я пытаюсь сохранить текущую дату и время, а затем обновить их, если один и тот же штрих-код на идентификационных картах сканируется дважды, трижды и т. д. Однако набор $ не обновляет элемент. Я уже просмотрел документацию MongoDB и другие сообщения о переполнении стека, но, похоже, ничего не работает. Другие сообщения о переполнении стека предлагали добавить

{ new: true }

и

( overwrite: true }

Я пробовал их как по отдельности, так и в тандеме, ни один из них не работал.

Мой код:

Student.findOne({StudNum: studNum}, function(err, studNumItem) {
   if (err) {
    res.send("MongoDB Error: " + err);
    return false;
   }
   if (!studNumItem) {
    var myData = new Student({ StudNum: studNum, Attendance : 1, LastDateTimeAttended : {
        Year: year, Month: month, Day: day, Hours: hours, Min: min, Sec: sec
    }});
    myData.save()
      .then(item => {
        res.send("saved to database: " + studNum + ", with attendance " + Attendance + "");
      })
      .catch(err => {
        res.send("unable to save to database: " + studNum + ", for attendance " + Attendance + "");
      });
    }
    else{
      var conditions = {StudNum: studNum};
      var update = {$inc : { Attendance: 1 }, $set : {
        "Year": year, "Month": month, "Day": day, "Hours": hours, "Min": min, "Sec": sec
      }};
      Student.findOneAndUpdate(conditions, update, { new: true }, function (err)
      {
          if (err) // If error
          {
            res.send(err);
          }
          else {
            res.send("Checked in!")
          }
      });
 }

});

И моя схема:

var studentSchema = mongoose.Schema({
StudNum: String,
Attendance: Number,
LastDateTimeAttended: {
  Year: Number,
  Month: Number,
  Day: Number,
  Hours: Number,
  Min: Number,
  Sec: Number
}
});

Заранее спасибо!

Обновлено: чтобы уточнить, сохранение элемента работает нормально, но обновление элемента нет, также при обновлении не возникают ошибки.

все ваши поля вложены в LastDateTImeAttended ... Вам необходимо использовать нотацию .dot для $set.

Ashh 02.09.2018 09:09
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
247
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В вашем случае я не уверен, что проблема в том, что вы нашли и обновили. Я считаю, что, поскольку то, что вы пытаетесь обновить, является вложенным объектом, вам нужно добавить к нему свойство верхнего уровня, чтобы мангуст сохранил его. Поскольку эти свойства не существуют на верхнем уровне, мангуст просто выбрасывает их.

var update = {$inc : { Attendance: 1 }, $set : {
    "LastDateTimeAttended.Year": year, "LastDateTimeAttended.Month": month, "LastDateTimeAttended.Day": day, "LastDateTimeAttended.Hours": hours, "LastDateTimeAttended.Min": min, "LastDateTimeAttended.Sec": sec
  }};

Я предлагаю вам попробовать сохранить дату в виде строки. LastDateTimeAttended в вашей модели должен ожидать строку, а новый конструктор Student должен создавать переменную LastDateTimeAttended, вызывая

let date = new Date();
LastDateTimeAttended = date.toString();

ваша новая схема должна выглядеть так

var studentSchema = mongoose.Schema({
StudNum: {type: String, required: true},
Attendance: {type: Number, required: true},
LastDateTimeAttended: {type: String, required: true}
});

после этого вы сможете обновить свой документ mongodb Student.findOneandUpdate (условия, обновление, обратный вызов). см. работу с mongoose Model.findOneandUpdate

Другие вопросы по теме