我在为我的应用程序开发后端时遇到了一个问题。我用猫鼬在后台运行快递。我有一个用户模型,它是这样的;
const mongoose = require('mongoose');
const userSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
email: { type: String, required: true, unique: true, match: /^(([^<>()[]\.,;:s@"]+(.[^<>()[]\.,;:s@"]+)*)|(".+"))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(([a-zA-Z-0-9]+.)+[a-zA-Z]{2,}))$/ },
username: { type: String, required: true, unique: true }, // using this one
fullName: { type: String, required: true, unique: true },
password: { type: String, required: true },
points: { type: Number, required: true }, // this one
status: { type: String, require: true }, // & this one
position: { type: String, required: true },
verficationKey: { type: String, required: true }
});
module.exports = mongoose.model('User', userSchema);
现在,我想在许多用户上更新"status"one_answers";points"钥匙。但对于每个用户来说,它们可能会有所不同。例如,假设一个用户可能已经有10点,必须获得+15,另一个用户可能有25点,必须获得+5。我想找到我的用户在我的数据库使用他们的"用户名";密钥(因为它是唯一的,我可以通过我的前端轻松访问它)。我不知道这是否可能……我对表达有点陌生。所以如果可能的话,请耐心解释一下。
- 我已经搞砸了
User.updateMany
,甚至User.find().where(...).in(...)
与第二个取得了一些进展,但无法将用户保存到我的DB可能写错了:(
- EDIT/UPDATE
这是我目前找到的(某种)运行我需要的代码。但首先,它一团糟,其次,它很糟糕。
router.put('/update/points', (req, res, next) => {
User.find().where('username').in(req.body.uid)
.exec()
.then(result => {
var points = req.body.points;
result.forEach((item) => {
points.forEach((user) => {
if (item.username === user[0]) {
item.points = user[1];
item.status = user[2]
item.position = user[3];
item.save()
.then()
.catch()
}
})
})
res.status(200).json({
message: "Success"
})
})
.catch(err => {
console.log(err);
res.status(500).json({
error: err
})
})
})
这就是我想到的,但我一点也不满意。玩了几个小时后,我发现了这个"解决方案"。但很明显,它很糟糕,效率很低。
在此之前,我做了类似的事情。这个看起来还行,但是我讨厌它。
这里也要注意。在我的body中,我从我的前端发送了一个看起来像这样的对象;
{"uid": ["user1", "user2", "user3"]"points"[("user1"10),("user2" 5),["user3", 25]
}
有了这个"解决方案"我别无选择,只能在我的前端也编写低效的代码。
是否有任何原因不能将uid
数组和points
数组合并为这样的东西?这样在服务器上处理数据就容易多了。
[
{ username: "user1", points: 10, status: 8, position: 21 },
{ username: "user2", points: 6, position: 4 },
{ username: "user3", points: 9 },
...
]
那么你可以在服务器上这样做:
router.put('/update/points', async (req, res, next) => {
try {
for (let user of req.body.users) {
let targetUser = await User.findOne({ username: user.username });
if (targetUser) {
// Make the changes and save
targetUser.points = user.hasOwnProperty("points") ? user.points : targetUser.points;
targetUser.status = user.hasOwnProperty("status") ? user.status : targetUser.status;
targetUser.position = user.hasOwnProperty("position") ? user.position : targetUser.position;
await targetUser.save();
}
}
res.status(200).json({
message: "Success"
});
} catch(err) {
console.log(err);
res.status(500).json({
error: err
});
}
});