我的 Express 服務器上有一個 .put 路由,它應該允許用戶在投票中投票,將其總投票數增加 1。
我希望同時使用兩者,.findOne and then doc.save()并且在我將標簽中的 poll 物件的值增加 1后.findOneAndUpdate,我的檔案會成功更新。
這是我的代碼:
router.put("/vote", async (req, res) => {
// let username = req.body.username;
let pollId = req.body.pollId;
let voteTarget = req.body.voteTarget; // is values like "mango" "pineapple"
const filter = { pollId: pollId };
let pollToUpdate = await Poll.findOne(filter);
let pollOptions = pollToUpdate.options;
let newPollValue;
for (let i = 0; i < pollToUpdate.options.length; i ) {
if (pollOptions[i].label === voteTarget) {
let currentVoteTargetValue = pollOptions[i].votes;
newPollValue = currentVoteTargetValue 1;
pollOptions[i].votes = newPollValue;
}
}
await pollToUpdate.save();
res.status(200).send(
"successfully updated poll value for "
voteTarget
" to value "
newPollValue
);
如您所見,我將我的選票設定到 Poll 檔案中,如下所示:
options: Array
0: Object
label: "apples"
votes: 0
1: Object
label: "oranges"
votes: 0
2: Object
label: "pineapple"
votes: 0
3: Object
label: "mango"
votes: 0
這就是它在 MongoDB 資料庫中的樣子。那只是它的領域。它在一個更大的檔案中。
這個 MongoDB 檔案頁面聲稱我可以使用 doc.save() 來實作我的目標。它不起作用,發送郵遞員請求一遍又一遍地增加輪詢不起作用。
另一個 mongodb 檔案頁面聲稱我可以findOneAndUpdate(filter, update)用來實作我的目標。它不起作用,對投票欄位的 1 請求不起作用。
具體來說,我一遍又一遍地發送這個 Postmanr 請求:
//put route
http://127.0.0.1:8080/api/poll/vote
// body
{
"username": "crono",
"pollId": "tr7b1sli6ufo5no0",
"voteTarget": "pineapple"
}
編輯:
甚至做
let newOptions = [...oldOptions];
updateTarget.options = newOptions;
console.log(updateTarget.options, 141);
await updateTarget.save();
正如我所期望的那樣,確實會增加檔案的未來價值。console.log 宣告指出“菠蘿”的投票數是 1 而不是它加載的 0。然后我呼叫await updateTarget.save()which 真的應該將我的更改提交到資料庫。然而,下一次 Postman 提出請求時,我又回到了 0。我很困惑。
uj5u.com熱心網友回復:
您的架構是否涉及混合 SchemaType?
在這種情況下,貓鼬失去了自動檢測和保存更改的能力(https://mongoosejs.com/docs/schematypes.html#mixed)。
pollToUpdate.markModified('options');在呼叫之前嘗試使用save。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/368086.html
