【问题标题】:Mongodb update/$set only works every other time function is called- and returns [object Object] [duplicate]Mongodb update/$set 仅在每隔一次调用函数时才有效-并返回 [object Object] [duplicate]
【发布时间】:2019-04-24 13:43:05
【问题描述】:

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

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

我正在使用 mongoose 并在 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 的当前值。然后,它将 this 增加 1,并将其添加回集合中。

但非常奇怪的是,$set 似乎只在我每隔一次调用该函数时才起作用。我第一次调用它时,变量 userReviewCount 保持在 0,第二次调用它变为 1,第三次保持在 1,第四次变为 2,依此类推。我无法理解为什么它会这样运行。为了调试,我将 res 输出到控制台,但结果始终是“更新结果:[object Object]”,这没有给我任何信息。

有没有人知道如何调试它?我已经想到了一切。

【问题讨论】:

  • 不要将查找和更新分开,只有一个方法可以做到这一点。还有$inc 以原子方式递增。更不用说使用JSON.stringify 来避免[object Object] 的事情了。
  • 感谢我已更新为使用 $inc!

标签: javascript mongodb mongoose


【解决方案1】:

您遇到了异步代码问题。

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

另外,你不需要查询两次,你可以从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

【讨论】:

  • 老兄,这非常有帮助,非常感谢。是的,我完全不了解 javascript 的异步特性。我会好好学习的!
猜你喜欢
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2023-03-06
  • 2016-04-08
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多