現在、Item
文書のMongooseスキーマがあります。この文書には、linkedItemsというサブ文書があります。以下の2つが定義されています。Mongooseサブ文書の更新に失敗しました
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,
});
すべてのリンクされたアイテムは、親Item
文書と各linkedItem
との間の関係の強さを格納score
属性を持っています。私は新しい評価をパスすると、親アイテムIDとリンクアイテムIDは、新しいスコアで平均化してリンクされたアイテムのスコアを更新することになっています(currentNumberOfRatings
は、スコアの平均をはるかに上回っている)。 updateLinkedItemRating
の以下のコードは、Mongooseのサブ文書にあるドキュメントに基づいてこのスコアを更新する予定です。 DBは正しく更新されず、コールバックのerr
とresult
の両方が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
}
);
});
'parseInt'と' * 1.0'の使い方は? –