如何使用Mongoose更新具有未知数量的可能字段的MongoDB集合

问题描述 投票:1回答:1

我想更新一个mongodb集合,而不知道将使用多少以及将使用哪些字段进行更新。例如,如果我有一个用户并且他们在不同的页面上更新有关它们的信息,那么它将不总是与更新的相同字段。

以下是我目前关于如何处理此问题的想法,但我对替代方案持开放态度。

app.post("/user", (req, res) => {
  console.log(req.body);
  // req.body can consist of 1 or more of the following { FirstName, LastName, Email, Interests, UserRole }
  const CreatedAt = Date.now();

  if (req.body.Name) {
    let promise = User.findOne({ Name: req.body.Name });
      promise.then(user => {
        for (let key in req.body) {
          // Name will print but nothing else, nothing is updated either and there are no errors
          console.log(key);
          User
            .where({_id: user._id })
            .setOptions({ multi: true })
            .update({ $set: { [key]: key } })
            .update({ $set: { UpdatedAt: Date.now() } })
            .catch(err => res.json({message:"Failed to update the database."}));
        }
      }).catch(err => res.json({message:"User could not be found."}));

  } else {
     res.json({message:"Please provide an email and a password."});
  };
});

这里的一个大问题是我不知道哪个字段或字段将被更新,如果检查以下每个可能的值是否可用,我不想做多久。

javascript node.js database mongodb mongoose
1个回答
0
投票

根据documentation你可以只改变字段并保存它:

app.post("/user", (req, res) => {
  console.log(req.body);
  //req.body can consist of 1 or more of the following 
  //  { FirstName, LastName, Email, Interests, UserRole }
  const CreatedAt = Date.now();

  if (req.body.Name) {
    User.findOne({ Name: req.body.Name })
    .then(user => {
      //mutate user:
      Object.keys(req.body).reduce(
        (user,key)=>{
          user[key]=req.body[key];
          return user;
        }
        ,user
      );
      //set UpdatedAt
      user.UpdatedAt = Date.now();
      //http://mongoosejs.com/docs/documents.html
      //  maybe outdated, does not mention promise but
      //  you could try return user.save()
      return new Promise(
        (resolve,reject)=>
          user.save(
            (err,user)=>
              (err)
                ? reject(err)
                : resolve(user)
          )
      )
    })
    .then(user=>res.json({message:user}))
    .catch(err => res.json({message:"User could not be found."}));
  } else {
    res.json({message:"Please provide an email and a password."});
  };
});
© www.soinside.com 2019 - 2024. All rights reserved.