【问题标题】:how to make async mongodb function in foreach loop? [duplicate]如何在 foreach 循环中创建异步 mongodb 函数? [复制]
【发布时间】:2020-11-30 14:23:15
【问题描述】:

我有一个类似于测验应用程序的东西,用户应该在提交后回答并查看结果。我将结果保存在 mongoDB 数据库中并使用 foreach 循环,因为它不止一个问题,我想在保存文档后将结果发送给用户注意:保存文档并替换它工作正常。我的代码如下所示:

//answers model
const User_Result = require("../models/result_model")

router.post("/quiz/results", (req, res)=>{
  var lastResult = 1;
  answersLenght.forEach((single, i) => {
        if(i==0) { //for the first right answer it should creat a document
          var result = new User_Result({
               id: req.user._id,
               endResult: lastResult
           })

           result.save()
        } else { // for other answers it should update endResult 
           lastResult = lastResult + 1
           User_Result.findOneAndReplace({_id: req.user._id}, {endResult: lastResult}, {new: true}, (err, r)=>{console.log(r)})
          }
  })
//it send empty []
  User_Result.find({_id: req.user._id}).then(data=>{
        res.send(data)
  })
})

它发送空的 [ ] 因为它会在保存之前查找文档

【问题讨论】:

  • 你真的需要做多个mongodb请求吗?您不能先将答案对象合并到endResult,然后将其存储在一个请求中吗?
  • 你能解释更多吗?
  • 真的不清楚你在这里要做什么以及answersLenght 的价值是什么。另外,您要查找和/或更新什么User_Results?看起来您在重复写入同一个 mongo 对象。

标签: javascript node.js mongodb mongoose async-await


【解决方案1】:

您正在使用id 保存一个 User_Result 文档:

var result = new User_Result({
           id: req.user._id,
           endResult: lastResult
       })

但是,您正在使用 _id 查询 User_Result 文档。

您想要做的是将_id 设置为req.user._id,如下所示:

//answers model
const User_Result = require("../models/result_model")

router.post("/quiz/results", (req, res)=>{
var lastResult = 1;
answersLenght.forEach((single, i) => {
    if(i==0) { //for the first right answer it should creat a document
      var result = new User_Result({
           _id: req.user._id,
           endResult: lastResult
       })

       result.save()
     } else { // for other answers it should update endResult 
        lastResult = lastResult + 1
        User_Result.findOneAndReplace({_id: req.user._id}, {endResult: lastResult}, {new: true}, (err, r)=>{console.log(r)})
      }
  })
  //it send empty []
  User_Result.find({_id: req.user._id}).then(data=>{
    res.send(data)
 })
})

【讨论】:

  • 和我的一样
  • @AkramAdil 您在创建新的 User_Result 时看到区别了吗?当您应该使用 _id 创建时,您正在使用 id 创建。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多