Node.js 为所有记录更新子文档数组中的字段

Node.js 为所有记录更新子文档数组中的字段,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,当我第一次创建我的站点时,我不知道MongoDB做了区分大小写的搜索,还有很多其他的事情,我正在尝试解决这些问题 我已经更新了代码,在保存之前修改了用户输入,所以它是小写的,并且删除了额外的空格 我可以很容易地从mongo shell更新用户集合,然后我很乐意去那里,但我还有另一个集合需要更新,它看起来如下: 注册数据对象: { event: string, field: string, users: [string], players: [ first: string, last: s

当我第一次创建我的站点时,我不知道MongoDB做了区分大小写的搜索,还有很多其他的事情,我正在尝试解决这些问题

我已经更新了代码,在保存之前修改了用户输入,所以它是小写的,并且删除了额外的空格

我可以很容易地从mongo shell更新用户集合,然后我很乐意去那里,但我还有另一个集合需要更新,它看起来如下:

注册数据对象:

{
event: string,
field: string,
users: [string],
players: [
  first: string,
  last: string,
  email: string
]
}
如果可以在mongo shell中对所有注册的players.email字段进行修改并使其小写,我很乐意这样做。但我不认为是这样,而且我在mongoose(使用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);
        }
      });
    });     
};
module.exports.regUpdateAll=函数(req,res){
console.log(“更新所有注册”);
Registration.find().exec((err,reg)=>{
注册费((注册费)=>{
对于(var i=0;i{
如果(!err){
资源状态(200)。发送(响应);
}否则{
控制台日志(err);
资源状态(500)。发送(错误);
}
});
});     
};
如何解决此问题?

您需要从注册模型的对象调用.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
        })
    })
  });

我明白了!这花了我一整天的时间,但我最终还是成功了。根据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);
  });


我就是不明白为什么。

哦,好吧。我没有意识到我必须单独保存每一个。我认为有一种方法可以一次性保存整个更新的对象数组。这很有效!我只需要在映射时指定reg.players中的所有其他字段,否则它不喜欢它。非常感谢。