更新所有记录的子文档数组中的字段

时间:2019-05-06 02:59:18

标签: node.js mongodb mongoose

当我第一次创建网站时,我不知道MongoDB进行区分大小写的搜索等等,而我正在尝试解决这些问题。

在保存之前,我已经更新了代码以更改用户输入,以便将其小写并修剪多余的空格。

我可以轻松地从mongo shell中更新一个用户集合,然后我很高兴去那里,但是我还有另一个需要更新的集合,它看起来像这样:

注册数据对象:

{
event: string,
field: string,
users: [string],
players: [
  first: string,
  last: string,
  email: string
]
}

如果可以通过修剪并从mongo shell中将其变为小写形式来更新所有注册的players.email字段,那么我很乐意这样做。但是我不认为这是事实,而且我在用猫鼬做这件事时遇到了麻烦(使用Node.js后端,AngularJS前端)。

我在想类似的东西,但出现类型错误:Registration.save不是函数:

module.exports.regUpdateAll = function(req, res) {
  console.log('UPDATE ALL REGISTRATIONS');
    Registration.find().exec((err, reg) => {
      reg.forEach((reg) => {
        for(var i = 0; i < reg.players.length; i++) { 
          reg.players[i].email = reg.players[i].email.toLowerCase().trim(); 
        }
      });
      console.log(reg);
      Registration.save(reg).then((err, response) => {
        if(!err) {
          res.status(200).send(response);
        } else {
          console.log(err);
          res.status(500).send(err);
        }
      });
    });     
};

如何解决此问题?

2 个答案:

答案 0 :(得分:2)

您需要从Registration模型的对象调用.save()。例如

Registration.find().exec((err, regtrations) => {
    regtrations.forEach((reg) => {
        reg.players =
            reg.players.map( p=> {
                p.email = p.email.toLowerCase().trim();
                return p;
            })

        console.log(reg);
        reg.markModified("players");
        reg.save( (error)=> { 
            //do something
        })
    })
  });

答案 1 :(得分:0)

我知道了!这花了整整一整天,但我终于使它起作用。我无法基于has_signed的值来使它工作,但是我能够通过这种方式做到这一点:

this.adminService.GetUnsignedWaivers()
    .subscribe((data: []) => {
      this.players = data;
      this.players.forEach((p) => {
        p.waivers =
            p.waivers.map( w=> {
              if(w.signatureUrl.length>0) {
                w.url = w.signatureUrl;
                w.message = "View Waiver";
              } 
                return w;
            });
    });
    this.size = this.players.length;
    console.log(this.players);
  });

Now it displays View Waiver and the correct link for folks who signed.

我只是不明白为什么。