为啥这个 Mongoose 更新不保存到数据库中?
Posted
技术标签:
【中文标题】为啥这个 Mongoose 更新不保存到数据库中?【英文标题】:Why isn't this Mongoose update saving to the database?为什么这个 Mongoose 更新不保存到数据库中? 【发布时间】:2019-01-03 18:58:34 【问题描述】:我有一个函数,可以将新日期添加到“举行的课程”日期数组中。
最初,我有一个从在线示例中复制的非异步函数。它使用了一个简单的 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
任何帮助表示赞赏。
【问题讨论】:
你怎么知道更新没有工作?您发布的任何代码都没有尝试确定这一点。 (注意Admin.update()
和.findOne()
一样是异步的。)
通过直接在mlab中查看数据库集合。它没有更新。应用程序的其他部分也保存到数据库中,并且工作正常。
【参考方案1】:
您是否尝试过这样更新它: Admin.update('local.className':'2018',$set : 'local.classesHeld' : classesHeld);
您需要使用 $set 运算符,请查看此文档:http://mongoosejs.com/docs/documents.html
希望对你有帮助:)
【讨论】:
添加了 $set 操作符,还是不行。不过,感谢您的建议和文档。 不客气。您如何检查更新的值?通过控制台或数据库管理面板? 使用管理面板 您也可以更新整个本地对象,其中包含 className 和 classesHeld,如下所示:Admin.update("local.className":"2018",$set : "local" : className :className ,classesHeld:classesHeld)
【参考方案2】:
试试:
await Admin.update('local.className':'2018',$set'local.classesHeld':classesHeld);
代替:
Admin.update('local.className':'2018','local.classesHeld':classesHeld);
【讨论】:
试过了,但它仍然没有更新数据库。谢谢你的建议。【参考方案3】:虽然以下应该可以工作
Admin.update('local.className':'2018',$set : 'local.classesHeld' : classesHeld);
但是因为它不适合你。您也可以尝试将今天的日期直接推送到 local.classesHeld
Admin.update('local.className':'2018', $push: 'local.classesHeld': today )
【讨论】:
【参考方案4】:好的,在 @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);
;
我已经在我的应用程序上运行了几天的这段代码,它似乎运行良好。感谢所有回答这个问题的人,我选择自己的答案只是因为它是一个完整的工作解决方案,但我从这个线程上的多个答案中借来了它。
【讨论】:
以上是关于为啥这个 Mongoose 更新不保存到数据库中?的主要内容,如果未能解决你的问题,请参考以下文章
当我“更新”时,Mongoose 操作字段是“查找”,为啥?
为啥我用mongoose将它保存在mongoDB中后无法获取数据库中的记录?