未能成功更新 Mongoose 子文档
Posted
技术标签:
【中文标题】未能成功更新 Mongoose 子文档【英文标题】:Unsuccessfully updating Mongoose subdocument 【发布时间】:2017-08-13 14:14:53 【问题描述】:我目前有一个 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
中的以下代码应该会更新此分数。它正确计算了新分数,但是数据库没有正确更新,并且回调中的err
和result
都记录为空。任何建议将不胜感激。
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
);
);
【问题讨论】:
parseInt
和* 1.0
有什么用?
【参考方案1】:
你不应该需要 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);
);
【讨论】:
以上是关于未能成功更新 Mongoose 子文档的主要内容,如果未能解决你的问题,请参考以下文章
更新子文档、NodeJS 和 Mongoose 的更有效方式