Javascript Mongoose按id递增嵌套数组

Javascript Mongoose按id递增嵌套数组,javascript,node.js,mongodb,mongoose,mongoose-schema,Javascript,Node.js,Mongodb,Mongoose,Mongoose Schema,这是我的模型: 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: S

这是我的模型:

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(
  { _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);
    }
  }
);

你能试试这个代码吗

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);
    }
  }
);

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

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

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

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

我试过了,它记录了投票结果,但仍然没有增加选票。还有,什么是外部?外部只是阵列过滤器的参考。你可以用其他任何方式来命名,真的。编辑了答案。你现在能试试吗?很高兴听你这么说。一开始有一个输入错误,很抱歉。我试过了,它记录了投票结果,但仍然没有增加投票数。还有,什么是外部?外部只是阵列过滤器的参考。你可以用其他任何方式来命名,真的。编辑了答案。你现在能试试吗?很高兴听你这么说。一开始有一个输入错误,对此很抱歉。你可以试试这个Poll.findOneAndUpdate{options.uid:optionId},{$inc:{options.$.vots:1},{new:true}你可以试试这个Poll.findOneAndUpdate{options.uid:optionId},{$inc:{options.$.vots:1},{new true}这也有效,必须执行更少的计算。这是真的。我相信ArrayFilter在一般情况下对于数组是非常好的,因为您可以非常轻松地修改代码,以便编写一个可重用的函数,该函数将采用动态值,而不是预定义值。例如,他现在可以用${req.body.vots}替换投票,用${req.body.field}替换选项。我理解这超出了问题的范围,我只是认为这值得一提。如果在一个数组中搜索,即在另一个数组中搜索,则arrayFilters很好,这意味着嵌套级别超过1级。是的,你可以使用ArrayFilter,但我想保持它的简单性。这也可以工作,并且必须执行更少的计算。这是真的。我相信ArrayFilter在一般情况下对于数组是非常好的,因为您可以非常轻松地修改代码,以便编写一个可重用的函数,该函数将采用动态值,而不是预定义值。例如,他现在可以用${req.body.vots}替换投票,用${req.body.field}替换选项。我理解这超出了问题的范围,我只是认为这值得一提。如果在一个数组中搜索,即在另一个数组中搜索,则arrayFilters很好,这意味着嵌套级别超过1级。是的,你可以选择ArrayFilter,但我想保持简单