【发布时间】: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有什么用?
标签: javascript node.js mongodb mongoose subdocument