2017-03-21 5 views
3

現在、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は正しく更新されず、コールバックの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 
     } 
    ); 
}); 
+0

'parseInt'と' * 1.0'の使い方は? –

答えて

1

あなたはすでにあなたがそうあなただけのこれらのプロパティを設定することができ

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

を行う際linkedItemを持っているし、その後.SAVE()

linkedItem.score = newAverageScore; 
linkedItem.currentNumberOfRatings = currentTotalNumberOfRatings; 
item.save(function(err, result){ 
    console.log(err); 
    console.log(result); 
}); 
を使用してあなたは、findOneAndUpdateを必要はありません
関連する問題