【发布时间】:2019-09-26 15:31:17
【问题描述】:
当我尝试使用 Poll.findOneAndUpdate() 和 $push 将文档更新到一个数组时,它似乎推送了 2 个相同的字符串。
我尝试将我之前做的 2 个 Poll.findOneAndUpdate 合并为一个,看看这是否是问题所在,但它仍然会推送 2 个字符串。
之前
var poll = await Poll.findOne({});
var choice = parseInt(message[1], 10);
var cIndex = choice - 1;
var cID = poll.choices[cIndex].id
var currV = poll.choices[cIndex].votes;
var i = currV + 1
var tUser = userstate.username
await Poll.findOneAndUpdate({ "_id": poll.id, "choices.id": cID },
{ $push: { voters: tUser } }, { useFindAndModify: false, new: true }, (err, doc) => {
})
await Poll.findOneAndUpdate({ "_id": poll.id, "choices.id": cID },
{ $set: { "choices.$.votes": i } }, { useFindAndModify: false, new: true }, (err, doc) => {
console.log(doc)
})
之后
var poll = await Poll.findOne({});
var choice = parseInt(message[1], 10);
var cIndex = choice - 1;
var cID = poll.choices[cIndex].id
var currV = poll.choices[cIndex].votes;
var i = currV + 1
var tUser = userstate.username
await Poll.findOneAndUpdate({ "_id": poll.id, "choices.id": cID },
{ $set: { "choices.$.votes": i }, $push: { voters: tUser } }, { useFindAndModify: false, new: true }, (err, doc) => {
console.log(doc)
})
它们都输出期望的结果:
{ active: true,
choices:
[ { id: 'RPSSbjCmIZ', text: 'Yes?', votes: 0 },
{ id: 'kxNHYi4oXV', text: 'No', votes: 0 } ],
voters: [ 'opti_21' ],
_id: 5d8bdcc4de15a567143075a9,
polltext: 'Tea? Hmmm',
__v: 0 }
但如果我检查它显示的文件:
{ active: true,
choices:
[ { id: 'IGPMUREdSP', text: 'Yes?', votes: 0 },
{ id: 'NDdrKIHQpE', text: 'No', votes: 0 } ],
voters: [ 'opti_21', 'opti_21' ],
_id: 5d8bd52fa7ccb866578cb38e,
polltext: 'Tea? Hmmm',
__v: 0 }
用于投票的 $set 对两种方式都适用。我只想将一个字符串推入数组,这样如果该用户再次尝试投票,他们将无法投票。
这是整个应用程序上下文中的代码: https://github.com/browemedia/vibey_bot/blob/50045043f410b13d0966c7f1c873fe6dd3b23905/server.js#L591
【问题讨论】:
标签: arrays node.js mongodb mongoose