Ailton
Ailton

Reputation: 117

Iterate over an array to find a specific index in MongoDB

I have the following route to find and update an array in MongoDB:

app.post("/respostaAprovChamado", function(req, res){
  if(req.isAuthenticated()){
    Chamado.updateMany(
      {"_id": req.body.idChamadoPost, "listaAprovadores.0.nome": { $in: [req.user.realNome]  }},
      {
        $set: {'listaAprovadores.0': [{nome: req.user.realNome}, {status: req.body.respostaAprov}]}
      },
      {
          returnNewDocument: true
      }
  , function( error, result){
    if(error){
      res.send(error)
    } else{
      res.redirect('/aprovChamados')
    }
  });
  }else{
    res.redirect('/login')
  }
})

It works fine, but the "listaAprovadores.0.nome" will update the first record in the array, so i tried to iterate using for() to update the second record:

app.post("/respostaAprovChamado", function(req, res){
  for(let i = 0; i < 1; i++){
    if(req.isAuthenticated()){
      Chamado.updateMany(
        {"_id": req.body.idChamadoPost, "listaAprovadores.i.nome": { $in: [req.user.realNome]  }},
        {
          $set: {'listaAprovadores.0': [{nome: req.user.realNome}, {status: req.body.respostaAprov}]}
        },
        {
            returnNewDocument: true
        }
    , function( error, result){
      if(error){
        res.send(error)
      } else{
        res.redirect('/aprovChamados')
      }
    });
    }else{
      res.redirect('/login')
    }
  }
}) 

but the for() does not work. How can i make the update to work iterating over the records of the array?

Upvotes: 0

Views: 99

Answers (1)

dangarfield
dangarfield

Reputation: 2330

i needs to be evaluated as part of the query.

Change: "listaAprovadores.i.nome" to `listaAprovadores.${i}.nome`

app.post("/respostaAprovChamado", function(req, res){
  for(let i = 0; i < 1; i++){
    if(req.isAuthenticated()){
      Chamado.updateMany(
        {"_id": req.body.idChamadoPost, `listaAprovadores.${i}.nome`: { $in: [req.user.realNome]  }},
        {
          $set: {'listaAprovadores.0': [{nome: req.user.realNome}, {status: req.body.respostaAprov}]}
        },
        {
            returnNewDocument: true
        }
    , function( error, result){
      if(error){
        res.send(error)
      } else{
        res.redirect('/aprovChamados')
      }
    });
    }else{
      res.redirect('/login')
    }
  }
}) 

Upvotes: 1

Related Questions