Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose:通过findOneAndUpdate查询使用对象数组的总和更新根数据属性无效_Node.js_Mongodb_Express_Mongoose_Mongodb Query - Fatal编程技术网

Node.js Mongoose:通过findOneAndUpdate查询使用对象数组的总和更新根数据属性无效

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(&

我正在尝试使用节点mongoose库更新mongo集合中的一个数组元素。以下是我的mongo模式的外观:

{
    "_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开始使用

  • $set
    更新id与
    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"] }
        }
      }
    }
  }]
)