使用 mongoose 更新 mongoDB 中的数组

吉尔斯·佛卡门

我正在尝试更新 mongoDB 中包含嵌套数组的文档。
情况如下:

我有一个 newsItem 模型,它可以包含一个 poll 对象。这个投票对象有:title、totalVotes 和 options。option 是一个对象数组,这些对象包含:optionName 和 optionVotes。在这些对象中的每一个中。optionVotes 是一个数组,其中包含对他们进行投票的用户的 ID。(因为我想跟踪谁对什么投票以及有多少我想防止投票两次)

所以它应该看起来像这样:

{
    "_id" : ObjectId("5bb7487727430319f5c18495"),
    "poll" : {
        "totalVotes" : 0,
        "title" : "test",
        "options" : [ 
            {
                "optionName" : "Burgers",
                "optionVotes" : []
            }, 
            {
                "optionName" : "Pizza",
                "optionVotes" : []
            }, 
            {
                "optionName" : "Fish",
                "optionVotes" : []
            }, 
            {
                "optionName" : "BBQ",
                "optionVotes" : []
            }, 
            {
                "optionName" : "Soup",
                "optionVotes" : []
            }, 
            {
                "optionName" : "Pasta",
                "optionVotes" : []
            }
        ]
    }
}

我现在要做的是,每当 api 路由 /news/votes/:id 被调用时,它都会用 :id 更新新闻项目并将用户 ID 放入给定的投票选项中。(在正文中)所以在请求中我有:用户 ID 和投票的 optionName

这是我目前得到的,但对我不起作用:

exports.vote = (req, res) => {
    News.findOneAndUpdate({ _id: req.params.id }).exec((err, newsItem) => {
        let tempItem = newsItem
        for (let i = 0; i < tempItem.poll.options.length; i++) {
            if (tempItem.poll.options[i].optionName === req.body.optionName) {
                tempItem.poll.options[i].optionVotes.push(req.user._id)
            }
        }
        console.log(tempItem.poll.options[0])
        tempItem.save(err => {
            if (!err) {
                return res.status(200).send()
            }
        })
    })
}

奇怪的是,当我这样做时:

tempitem.poll.title = '新标题' tempitem.save()

那么标题确实会在数据库中更新!代码中的 console.log 确实输出了正确的对象。

我还尝试使用更标准的方式:

findOneAndUpdate({ _id: req.param.id }, {$addToSet: {.....}}).exec(...)

但是那样我实际上不知道如何从数组中获取具有特定键的对象,然后更新该对象的一部分。

我正在考虑的其他 2 个选项:

  • 将整个 poll 对象提取到另一个文档,然后在 newsItem 中使用引用..但这也不能解决问题(对 SQL 也有感觉)
  • 不是将投票用户的数组放在每个投票选项中,而只是创建一个包含所有投票人的用户数组。--> 缺点:我不知道谁对什么投票了..
阿克里昂

由于您并没有真正使用 findOneAndUpdate (因为您没有提供实际更新),您可以简单地使用findOne并尝试以下操作:

exports.vote = (req, res) => {
    News.findOne({ _id: req.params.id }).exec(err, tempItem) => {
        let option = tempItem.poll.options.find(({optionName}) => optionName == req.body.optionName)
        option.optionVotes.push(req.user._id)
        console.log(option)

        tempItem.save(err => {
            if (!err) {
                return res.status(200).send()
            }
        })
    }
}

那将是一种方法。我认为最好的方法是利用该update部分并findOneAndUpdate与传入的更新对象一起使用

像这样:

findOneAndUpdate({ 
   _id: req.param.id, 'poll.options.optionName': req.body.optionName
}, 
{ $addToSet: 
  { 'poll.options.$.optionVotes': req.user._id }
}).exec(...)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用 mongoose 更新 MongoDB 中的数组?

如何使用MongoDB(Mongoose)在集合中添加/更新ObjectId数组?

如何使用 Mongoose 更新 MongoDB 中的文档

更新子文档中的数组-mongoose mongodb

数组中的MongoDB(Mongoose)更新元素

使用 mongoose 在 MongoDB 上更新

如何使用 mongoose 在单个 mongodb 文档中更新数组中的多个对象

使用Mongoose访问MongoDB中的数组条目

如何使用 mongoose 在 mongodb 中过滤数组?

使用Mongoose和Node.js更新MongoDB中的数据

什么是使用Mongoose更新MongoDB中许多记录的正确方法

如何使用Mongodb / Mongoose中的子文档处理深度更新?

是否可以在post方法中更新mongodb集合(使用Mongoose)?

如何使用Mongoose更新MongoDB中的一个属性?

使用Mongoose更新数组中的子文档

Mongoose MongoDB:更新嵌套数组中的对象

如何在mongoDB或Mongoose中更新嵌套数组的值

使用 mongoose/mongoDB 创建/更新对象

mongoose / mongodb不会使用PUT更新

mongoose / javascript:无法在Mongodb中更新集合

更新 mongodb 集合中的 json 对象:mongoose

Mongoose 模型数据未在 mongodb 中更新

使用更新 mongoDB 从 objectId 数组中删除

Mongoose 更新查询 - Mongoose/Mongodb

更新/拉取Mongodb / Mongoose中子文档数组中包含的数组中的值

使用mongoose在MongoDB中创建记录时填充数组

使用Mongoose将元素添加到MongoDB中的数组

mongodb从数组中拉出对象无法使用mongoose

如何使用Mongoose / MongoDB在数组中定义对象