我想更新一个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."});
};
});
这里的一个大问题是我不知道哪个字段或字段将被更新,如果检查以下每个可能的值是否可用,我不想做多久。
根据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."});
};
});