簡體   English   中英

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

[英]How to update a MongoDB collections with an unknown number of possible fields using Mongoose

我想更新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."});
  };
});

這里最大的問題是,我不知道將更新哪個或哪些字段,並且如果要檢查以下每個可能值是否可用,我也不想花很長時間。

根據文檔,您可以更改字段並保存:

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."});
  };
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM