首页 > 解决方案 > 如何编写 MongoDB 查询来执行以下更新?

问题描述

我想在下面的 Mongo 文档中更新特定考试的特定问题的内部字段,例如 user_answer、isAnswered 等。

在此处输入图像描述

上图的文档文件:

{
  "_id":{"$oid":"60508fb1c4b07a4134e75644"},
  "student_id":"5faaac5d35b7ba4ed406e765",
  "exams":[
    {"score":null,
     "time_taken":null,
     "exam_taken":true,
     "_id":{"$oid":"60508fb1c4b07a4134e75645"},
     "exam_id":"5fbfc8ea9831540072063e62",
     "questions":[
       {"user_answer":null,
        "isAnswered":false,
        "isUnanswered":true,
        "isFlagged":false,
        "_id":{"$oid":"5fbfc8659831540072063e61"}
       }
     ]
    }
  ]
}

我为此写了一个查询,但它不起作用。

try{
   await req.db
    .collection('result')
    .findOneAndUpdate({ student_id: ObjectId("5faaac5d35b7ba4ed406e765"), "exams._id": ObjectId(exam_id),"exams.questions._id":ObjectId(question_id) }, {
      $set: {
        'questions.$.user_answer': answer,
        'questions.$.isAnswered':true,
        'questions.$.isUnanswered':false,
        'questions.$.isFlagged':false
      }
    }
    );
  res.status(201).end();
  }catch(e){
    console.log(e);
  }

虽然我确信查询本身有问题,但如果你们中的任何人能告诉我如何执行此类更新,我将不胜感激。

谢谢你一样

标签: databasemongodbmongoosemongodb-querynosql

解决方案


从 MongoDB 3.5.12 开始,您可以使用带有选项arrayFilters的更新运算符来更新嵌套数组元素。

   db.collection.update({
  "student_id": ObjectId("5faaac5d35b7ba4ed406e765"),
  "exams.exam_id": ObjectId("5fbfc8ea9831540072063e62")
},
{
  $set: {
    "exams.$.questions.$[question].user_answer": "You are the best",
    "exams.$.questions.$[question].isAnswered": true,
    "exams.$.questions.$[question].isUnanswered": false,
    "exams.$.questions.$[question].isFlagged": false
  }
},
{
  arrayFilters: [
    {
      "question._id": ObjectId("5fbfc8659831540072063e61")
    }
  ],
  multi: true
})

推荐阅读