[英]How can I update 2 collections at the same time using Node.js/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.