【问题标题】:Mongoose increment nested array by idMongoose 按 id 递增嵌套数组
【发布时间】:2020-09-29 10:29:14
【问题描述】:

这是我的模型:

const mongoose = require("mongoose");
const shortid = require("shortid");
const { v4: uuidv4 } = require("uuid");

const PollSchema = new mongoose.Schema({
  id: {
    type: String,
    default: shortid.generate
  },
  question: {
    type: String
  },
  options: [
    {
      option: {
        type: String
      },
      votes: {
        type: Number,
        default: 0
      },
      uid: {
        type: String,
        default: uuidv4
      }
    }
  ],
  created: {
    type: Date,
    default: Date.now
  }
});

module.exports = Poll = mongoose.model("poll", PollSchema);

我需要通过 uid 搜索投票并将投票数加 1。 这是我尝试过的,但它不起作用:

Poll.findOneAndUpdate(
  { options: { $elemMatch: { uid: optionId } } },
  { $inc: { "options.$.votes": 1 } },
  { new: true }
);

数据库中没有任何更新我不知道为什么。我提供的搜索 uid 的 var 是 optionId。

【问题讨论】:

  • 你可以试试这个Poll.findOneAndUpdate({ "options.uid": optionId }, { $inc: { "options.$.votes": 1 }, { new: true } })

标签: javascript node.js mongodb mongoose mongoose-schema


【解决方案1】:

你能试试这个代码吗:

Poll.findOneAndUpdate(
  { _id: id }, //that is poll id
  {
    $inc: { [`options.$[outer].votes`]: 1 }
  },
  {
    arrayFilters: [{ "outer.uid": optionId }],
    new: true
  },
  function(err, poll) {
    if (!err) {
      console.log(poll);
    }
  }
);

【讨论】:

  • 我试过了,它记录了投票,但它仍然没有增加投票。还有,什么是外层?
  • "outer" 只是arrayFilters 的参考。你真的可以用其他方式命名它。编辑了答案。请问现在可以试试吗?
  • 很高兴听到。一开始有错别字,抱歉。
【解决方案2】:

对于 1 级嵌套,无需使用 arrayFilters,因此应该可以:

Poll.findOneAndUpdate({ _id: yourId, "options.uid": optionId }, { $inc: { "options.$.votes": 1 }, { new: true } })

【讨论】:

  • 这也有效并且必须执行更少的计算。
  • 确实如此。我相信arrayFilters 对于一般数组而言非常棒,因为您可以非常轻松地修改代码以编写一个可重用的函数,该函数将采用动态值,而不是预定义的值。例如,他现在可以将votes 替换为${req.body.votes},将options 替换为${req.body.field}。我知道这超出了问题的范围,我只是觉得值得一提。
  • arrayFilters 如果您在一个数组中搜索很好,那就是在另一个数组中,这意味着超过 1 级嵌套。是的,您可以使用 arrayFilters,但我希望保持简单
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 2017-03-15
  • 2019-03-28
  • 1970-01-01
  • 2015-03-26
  • 2017-01-24
  • 2012-07-05
相关资源
最近更新 更多