Node.js Mongoose:通过findOneAndUpdate查询使用对象数组的总和更新根数据属性无效
我正在尝试使用节点mongoose库更新mongo集合中的一个数组元素。以下是我的mongo模式的外观:Node.js Mongoose:通过findOneAndUpdate查询使用对象数组的总和更新根数据属性无效,node.js,mongodb,express,mongoose,mongodb-query,Node.js,Mongodb,Express,Mongoose,Mongodb Query,我正在尝试使用节点mongoose库更新mongo集合中的一个数组元素。以下是我的mongo模式的外观: { "_id": ObjectId("5f8a94ccc8452643f1498419"), "private": false, "score": 2000, "questions": [{ "_id": ObjectId(&
{
"_id": ObjectId("5f8a94ccc8452643f1498419"),
"private": false,
"score": 2000,
"questions": [{
"_id": ObjectId("5f8a94e8c8452643f149841c"),
"order": 1,
"category": "TEXT",
"definition": "about us",
"score": 1,
}, {
"_id": ObjectId("5f8a94e8c8452643f149841d"),
"order": 2,
"category": "HTML",
"definition": "about us",
"score": 0.5
}]
}
我正在更新问题数组中的分数,根数组中要更新的分数属性是数组分数的总和,即
root score => question array1.score + array2.score
我使用了以下mongoose函数:
Model.findOneAndUpdate(
{
_id: id,
"questions._id": qid,
},
{
'$set': {
'questions.$.order': 1,
'questions.$.score': 1,
'questions.$.type': 'HTML',
'$sum': { 'score': 'questions.score' }
}
})
当所有其他属性都得到更新时,根分数永远不会得到更新
注意:$setoninsert不是一个选项,因为在本例中,upert总是false
使用一个查询就可以执行这两个更新吗?您可以从MongoDB 4.2开始使用
更新id与$set
qid匹配的匹配问题
从$set
数组问题的分数更新根分数
它可以工作。谢谢你,老兄……你让我高兴极了:)
let id = mongoose.Types.ObjectId("5f8a94ccc8452643f1498419");
let qid = mongoose.Types.ObjectId("5f8a94e8c8452643f149841c");
let question = {
score: 1,
order: 1,
category: "TEXT"
};
Model.findOneAndUpdate(
{ _id: id },
[{
$set: {
questions: {
$map: {
input: "$questions",
in: {
$mergeObjects: [
"$$this",
{
$cond: [
{ $eq: ["$$this._id", qid] },
question, // add update fields in object
{}
]
}
]
}
}
}
}
},
{
$set: {
score: {
$reduce: {
input: "$questions",
initialValue: 0,
in: { $add: ["$$value", "$$this.score"] }
}
}
}
}]
)