【问题标题】:Why am I getting a duplicate string when I $push to an array in a document using mongoose?为什么当我使用 mongoose $push 到文档中的数组时会得到重复的字符串?
【发布时间】: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


    【解决方案1】:

    使用$addToSet

    $addToSet 如果已包含该项目,则不要将其添加到给定字段中,另一方面,$push 会将给定对象添加到字段中,无论它是否存在。

    更多详情visit mongo $addToSet

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      相关资源
      最近更新 更多