我所拥有的功能是将新日期添加到“班级”日期数组中。
最初,我有一个从在线示例中复制的函数,该函数不是异步的。它使用了一个简单的Mongoose'document.save'调用,并且工作了几天。然后停止更新数组。
所以我进行了一些调试,并认为我可能需要一个异步功能,但这也不起作用。我知道我做错了事,但是我不知道那是什么。
这是我的代码,其中包含console.logs以显示该函数的作用:
this.updateDate = async function () {
try {
let today = this.getFullDate(); // returns a string that I use as a date in the database
await Admin.findOne({'local.className':'2018'}).then(function(course){
console.log('today: '+today);
console.log('course: '+course);
let classesHeld = course.local.classesHeld;
console.log('classesHeld: '+classesHeld);
console.log('index: '+classesHeld.indexOf(today));
if(classesHeld.indexOf(today)=== -1){
classesHeld.push(today);
console.log('added today: '+classesHeld);
Admin.update({'local.className':'2018'},{'local.classesHeld':classesHeld});
console.log('saved it');
}
else{
console.log('Today\'s date already in database.');
}
});
} catch (error) {
console.log('Error in update date: ' + error);
}
}
这是我在控制台中看到的内容:
today: 7/26/2018
course: { _id: 5b57904b0bed9d3004979604,
__v: 0,
local:
{ className: '2018',
classesHeld:
[ '7/16/2018',
'7/17/2018',
'7/18/2018',
'7/19/2018',
'7/23/2018',
'7/24/2018',
'7/25/2018' ] } }
classesHeld:
7/16/2018,7/17/2018,7/18/2018,7/19/2018,7/23/2018,7/24/2018,7/25/2018
index: -1
added today:
7/16/2018,7/17/2018,7/18/2018,7/19/2018,7/23/2018,
7/24/2018,7/25/2018,7/26/2018 // this is correct
saved it // nope
任何帮助表示赞赏。
答案 0 :(得分:1)
尝试:
await Admin.update({'local.className':'2018'},{$set{'local.classesHeld':classesHeld}});
代替:
Admin.update({'local.className':'2018'},{'local.classesHeld':classesHeld});
答案 1 :(得分:1)
尽管以下方法应该起作用
Admin.update({'local.className':'2018'},{$set : {'local.classesHeld' : classesHeld}});
但是它不适合您。您也可以尝试将今天的日期直接推送到 local.classesHeld
Admin.update({'local.className':'2018'}, {$push: {'local.classesHeld': today }})
答案 2 :(得分:0)
您是否尝试过像这样更新它: Admin.update({'local.className':'2018'},{$ set:{'local.classesHeld':classesHeld}});
您需要使用$ set运算符,请查看以下文档:http://mongoosejs.com/docs/documents.html
希望它会有所帮助:)
答案 3 :(得分:0)
好吧,在@Pointy的技巧(我正在调用的Mongoose函数已经是异步的)的帮助下,使用@cheekujha建议的$ push,我得到了以下代码:
this.updateDate = async function () {
try {
let today = this.getFullDate();
Admin.findOne({
'local.className': '2018'
}, function (err, course) {
if (err) {
console.log('Error in updateDate: ' + err);
} else {
let classesHeld = course.local.classesHeld;
if (classesHeld.indexOf(today) === -1) {
Admin.findOneAndUpdate({
'local.className': '2018'
}, {
$push: {
'local.classesHeld': today
}
},{new:true},function(err,obj){
if(err){
console.log('update error: '+err);
}else{
console.log('Returned from db: '+obj);
}
});
}
}
});
} catch (error) {
console.log('Error in updateDate: ' + error);
}
};
我已经在我的应用程序上运行了几天这些代码,并且看起来运行良好。谢谢所有回答此问题的人,我选择了自己的答案,只是因为它是一个完整的可行解决方案,但我借用了该线程上的多个答案来提出它。