【问题标题】: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中查看数据库集合。它没有更新。应用程序的其他部分也保存到数据库中,并且工作正常。

标签: javascript mongodb asynchronous mongoose


【解决方案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);
        }
    };
    

    我已经在我的应用程序上运行了几天的这段代码,它似乎运行良好。感谢所有回答这个问题的人,我选择自己的答案只是因为它是一个完整的工作解决方案,但我从这个线程上的多个答案中借来了它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 2017-01-16
      • 2020-03-10
      • 2016-04-20
      • 1970-01-01
      相关资源
      最近更新 更多