Я работаю над системой баз данных с использованием 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
}
});
Заранее спасибо!
Обновлено: чтобы уточнить, сохранение элемента работает нормально, но обновление элемента нет, также при обновлении не возникают ошибки.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В вашем случае я не уверен, что проблема в том, что вы нашли и обновили. Я считаю, что, поскольку то, что вы пытаетесь обновить, является вложенным объектом, вам нужно добавить к нему свойство верхнего уровня, чтобы мангуст сохранил его. Поскольку эти свойства не существуют на верхнем уровне, мангуст просто выбрасывает их.
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
все ваши поля вложены в
LastDateTImeAttended... Вам необходимо использовать нотацию .dot для$set.