未能成功更新 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
中的以下代码应该会更新此分数。它正确计算了新分数,但是数据库没有正确更新,回调中的 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
}
);
});
你不应该需要 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);
});
我目前有一个用于 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
}
);
});
你不应该需要 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);
});