Mongoose :更新json数组中的元素

标签 mongoose mongodb-atlas

我正在尝试更新如下所示的用户文档:

{
_id:"xyzdon'tcare",
username:"john",
examTrials:Array[
    {
        trialId:"x1",
        examId:"y",
        questions:Array[
            {ques1 Object},
            {ques2 object}
        ]
    },
    {
        trialId:"x2",
        examId:"z",
        questions:Array[
            {ques1 Object},
            {ques2 object}
        ]
    }]
}

我尝试了最直接的方法,findOne() 然后修改文档,然后 save()。问题是,当新请求在上一次更新完成之前到达时,我遇到了文档版本的竞争条件问题。

现在我正在尝试使用 findOneAndUpdate() 来更新特定试验中问题数组内的问题对象,但我似乎无法弄清楚如何做到这一点。

我掌握的信息:

  • 试用编号
  • 问题对象
  • 问题编号

我想这就是我所需要的。有帮助吗?

------------ 编辑

app.post('/updatetrialsession',authenticateJWT ,(req,res)=>{
        User.findOneAndUpdate({
        username: req.user.username
      }, {
           $set: {'examTrials.$[elem1].questions.$[elem2]' : req.body.question,
                'examTrials.$[elem1].currentQuestion':req.body.questionIdx+1 }
      }, {
           arrayFilters: [{'elem1.trialId': req.body.trialId }, {'elem2': req.body.questionIdx}]
      }).then(res=>{
          console.log("updated")
      })
})

currentQuestion 已更新,但问题对象没有。

最佳答案

您可以使用 mongoose arrayFilter 来更新数组中的 a 字段。

例如,如果您有 userId 查询您的用户,trialId 查询您的考试试用,questionId 查询您的问题,newQuestionObject 作为您对问题的更新此代码将为您完成工作:

User.findOneAndUpdate({
  _id: userId
}, {
     $set: {'examTrials.$[elem1].questions.$[elem2]' : newQuestionObject}
}, {
     arrayFilters: [{'elem1.trialId': trialId}, {'elem2': questionId}]
});

或者如果你想更新问题对象的特定字段,你可以像这样简单地做:

User.findOneAndUpdate({
  _id: userId
}, {
     $set: {'examTrials.$[elem1].questions.$[elem2].status' : 'newStatus'}
}, {
     arrayFilters: [{'elem1.trialId': trialId}, {'elem2': questionId}]
});

关于 Mongoose :更新json数组中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62686488/

相关文章:

javascript - Mongoose near(...) 对 2dsphere 索引字段的查询未返回有效结果

node.js - Mongoose-如何创建具有默认值的集合?

javascript - Mongodb $graphLookup 构建层次结构

Mongodb atlas搜索: how to make use of multiple analyzers for the same query string,以便至少返回一些结果

node.js - 如何在 forEach 循环中运行 Mongoose 查询

javascript - Mongoose .js : How to Implement Tree Structure via Population

mongodb - 您可以将 MongoDB 与 Firebase 托管一起使用吗?

javascript - 如何从firebase云功能连接到MongoDb Atlas

javascript - 错误 : querySrv ENOTFOUND _mongodb. _tcp.cluster0.kspub.mongodb.net