繁体   English   中英

未成功更新Mongoose子文档

[英]Unsuccessfully updating 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的以下代码段应该更新此分数。 它正确地计算了新分数,但是DB没有正确更新,并且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);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM