Mongodb update / $ set仅在每隔一次调用函数时才起作用,并返回[object Object]

时间:2018-11-21 22:32:55

标签: javascript mongodb mongoose

我有一个电影评论网站。我的mongo数据库中有两个收藏夹,一个收藏夹用于我的电影评论,另一个收藏夹用于用户提交的评论。

每当用户提交自己的评论时,我都希望在我的评论集合中增加变量userReviewCount。

我正在使用猫鼬并在javascript中运行所有内容:

function saveUserReview(review) {

collections.ReviewModel.findOne(
    { 'filmId': review._filmId.toNumber() }, 
    function(err, result) {
        if (err) throw err;
        currentCount = result.userReviewCount;
        currentCount++;
    });

collections.ReviewModel.update(
    { 'filmId': review._filmId.toNumber() }, 
    { $set: { "userReviewCount": currentCount } }, 
    function(err, res) {
        if (err) throw err;
        console.log("Result of update:" + res);
    });  

因此,只要用户提交评论,就会调用此函数。首先,它使用findOne通过其ID查找我的评论,并获取userReviewCount的当前值。然后,将其递增1,并将其添加回集合中。

但是超级奇怪的是,每次我调用该函数时,$ set东西似乎都只能工作。我第一次将其称为变量userReviewCount保持为0,第二次将其称为1,第三次将其保持为1,第四次将其变为2,依此类推。我无法理解它为何如此运行。为了进行调试,我将res输出到控制台,但结果始终是“ update:[object Object]的结果”,这没有任何信息。

有人知道如何调试吗?我已经考虑了一切。

1 个答案:

答案 0 :(得分:0)

您在使用异步代码时遇到了问题。

数据库响应后,您正在增加当前计数,但是在增加响应之前,您发送了设置查询

此外,您不需要查询两次,可以从findOne获取结果,进行更改并保存

function saveUserReview(review) {
    var query = { 'filmId': review._filmId.toNumber() }

    collections.ReviewModel.findOne(query, function(err, result) {
        if (err) throw err;
        result.userReviewCount++;
        // could also be result.set(userReviewCount, result.userReviewCount + 1)
        result.save();

    });
}

我建议阅读有关javascript的异步特性

此外,您无法调试的原因是要向字符串中添加对象,以便将对象转换为字符串[Object object]并进行打印。正确的方法是console.log("Result of update:", res);或创建两个不同的console.log