javascript - 未能成功更新 Mongoose 子文档

标签 javascript node.js mongodb mongoose subdocument

我目前有一个用于 Item 文档的 Mongoose 模式,它有一个名为 linkedItems 的子文档。两者定义如下:

const ItemSchema = new Schema({
    description: { type: [String], required: true },
    linkedItems: [linkedItemSchema],
});

const linkedItemSchema = new Schema({
    _id: Schema.Types.ObjectId,
    title: String,
    score: Number,
    currentNumberOfRatings: Number,
});

所有链接项都有一个score 属性,它存储父Item 文档和每个linkedItem 之间关系的强度。我有一个函数 updateLinkedItemRating,当传递一个新的评级、父项目 ID 和链接项目 ID 时,它应该通过对新分数进行平均来更新链接项目的分数(currentNumberOfRatings 是迄今为止已平均计入分数的评级数)。根据我在 Mongoose 子文档中找到的文档,updateLinkedItemRating 中的以下代码应该会更新此分数。它正确计算了新分数,但是数据库没有正确更新,回调中的 errresult 都记录为 null。如有任何建议,我们将不胜感激。

Item.findOne({ _id: parentItemId }, function(err, item) {
    // Calculate new average score, this all works fine
    const linkedItem = item.linkedItems.id(linkedItemId);
    const currentTotalNumberOfRatings = linkedItem.currentNumberOfRatings;
    const currentScore = linkedItem.score;
    const newAverageNumerator = parseInt(currentScore) * parseInt(currentTotalNumberOfRatings) + parseInt(rating);
    const newAverageDenominator = parseInt(currentTotalNumberOfRatings) + 1;
    const newAverageScore = newAverageNumerator * 1.0 / newAverageDenominator;

    console.log(newAverageScore); // This logs the proper number
    //This does not update the DB as expected
    Item.findOneAndUpdate(
        { _id: item._id, 'linkedItems._id': linkedItemId },
        {
            $set: {
                'linkedItems.$.score': newAverageScore,
                'linkedItems.$.currentNumberOfRatings': currentTotalNumberOfRatings + 1,
            },
        },
        function (err, result) {
            console.log(err); // Logs null
            console.log(result); // Logs null
        }
    );
});

最佳答案

你不应该需要 findOneAndUpdate,因为你已经有了 linkedItem

const linkedItem = item.linkedItems.id(linkedItemId);

所以你可以只设置这些属性然后使用.save()

linkedItem.score = newAverageScore;
linkedItem.currentNumberOfRatings = currentTotalNumberOfRatings;
item.save(function(err, result){
  console.log(err);
  console.log(result);
});

关于javascript - 未能成功更新 Mongoose 子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42935154/

相关文章:

javascript - 如何以方程的形式产生两个值的输出而不仅仅是输出?

node.js - 如何要求 Node 子模块的模块

html - 在电子邮件中从 EJS 模板创建的链接不起作用

node.js - MongoDB:$lookup 数组后的 $sum

node.js - 无法理解为什么 try and catch 在 mongoose 中没有按预期工作

javascript - 模拟悬停事件

javascript - 如果滚动页面时调整窗口大小,如何使此效果起作用

c - 无法使用 FFI 将结构内部的字符串数组传递给 C 函数

javascript - Mongodb find() 只包含非空数组

javascript - div标签对齐问题