在為我的應用程式開發后端時,我遇到了一個問題。我使用 Mongoose 在我的后端運行 Express。我有一個用戶模型,是這樣的;
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);
現在,我想在許多用戶上更新“狀態”和“積分”鍵。但是對于每個用戶,他們可能——也可能會——有所不同。例如,假設一個用戶可能已經有 10 分并且必須獲得 15,而另一個用戶可能有 25 并且必須獲得 5。我想使用他們的“用戶名”鍵在我的資料庫中找到我的用戶(因為它是獨一無二的,我可以通過我的前端輕松訪問它)。我不知道這是否可能......我對表達和 mongo 有點陌生,所以請耐心解釋 - 如果可能的話。
- 我已經搞砸了
User.updateMany,甚至User.find().where(...).in(...)第二個取得了一些進展,但無法將用戶保存到我的資料庫中,可能寫錯了:(
- 編輯/更新
這是我目前找到的用于(某種)運行我需要的代碼。但首先它是一團糟,其次,它的壞。
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
})
})
})
這是我想出的,但我一點都不滿意。玩了幾個小時后,我找到了這個“解決方案”。但顯然它很糟糕而且效率低下。
在此之前,我做過類似的事情。這個似乎有效,但我討厭它。
這里也有一個說明。在我的身體中,我從前端發送了一個看起來像這樣的物件;
{ "uid": ["user1", "user2", "user3"], "points": [ ["user1", 10], ["user2", 5], ["user3", 25]
] }
So with this "solution" i have no other option but to write inefficient code to my front side too.
uj5u.com熱心網友回復:
有什么理由不能將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
});
}
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/333166.html
