【问题标题】:Mongoose Model - Updating an ArrayMongoose 模型 - 更新数组
【发布时间】:2015-08-04 17:43:05
【问题描述】:
{ _id: 55c02ab7684c7a601ca24898,
  title: 'this is a better poll',
  link: 'this-is-a-better-poll',
  creator: 'user',
  __v: 0,
  choices:
   [ { text: 'Option 1', votes: 0 },
     { text: 'Option 2', votes: 0 } ] }

这是一个投票的例子。假设我的数据库中有多个。

我需要通过比较 Option 来更新客户端每次 POST 请求的 投票数发布到服务器并与数据库进行比较。

由于数据库中有多个轮询,我使用 链接 来查找确切的数据库对象。

我尝试了多种方法来更新投票数,但似乎没有任何效果,但更改标题却完美无缺。为什么?

失败的方法:

for example selection is: 
var selection = 'Option 1';
var link = 'this-is-a-better-poll';

1) Model.where({"choices.text": selection}).update({$set: {"choices.votes" : 1}});

2) Model.update({"choices.text": selection}, {'$set': {"choices.$.votes" : 1}});

3)     Model.findOne({
        link: link
    }, function(err, found) {
        if (err) {
            return res.status(400).send({
                message: 'Error'
            });
        }
        if (found) {
            console.log(found.choices);
            var arr = found.choices;
            for (var i = 0; i < arr.length; i++) {
                if (arr[i].text == selection) {
                    arr[i].votes = 1
                    console.log(arr[i].votes = 1);
                }
                found.save(function(err) {
                    if (err) res.send(err);
                    res.status(200).send({
                        message: 'Succes'
                    });
                });
            }

        }
    });

我该如何解决这个问题?进行选择时如何更新投票计数?

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    你的选择 2 应该可以完美地与小改动一起工作:

    Model.update(
       {
           "_id": "55c02ab7684c7a601ca24898",
           "choices.text": selection
       }, 
       { "$inc": { "choices.$.votes" : 1 } },
       function(err,numAffected) {
    
       }
    );
    

    $inc 是您可能真正想要做的,以“增加”匹配选项的投票数。

    另一部分是positional $ 运算符,它从查询选择"choices.text" 中获取与数组索引匹配的元素,并将其“传递”到语句的“更新”块以更新匹配的索引。

    还要注意,在“查询”块中,我们也要求文档_id 值。很可能在许多文档中都存在“选项 1”之类的文本,因此您真的只想对其中一个进行投票。

    此外,前面提到的“位置”运算符只匹配每个文档的“一个”数组位置。因此,如果“选项 1”多次出现,则只会更新“第一个”匹配项。

    如果您需要更新“多个”,那么您正在重复操作,直到 numberAffected 返回为 0 或您希望在那里使用的任何其他方法。但每次操作只有一个会匹配和更新。

    所以 1.) 不起作用,因为缺少位置运算符。还有 2.) 尽管有其他问题也很糟糕,因为它涉及读取数据并在代码中进行修改,然后“希望”在写回服务器之前没有其他任何东西改变数据。

    除了那些单独2的问题之外,当你只能发出一个时,它也是对服务器的多个请求。

    【讨论】:

    • 这是一个非常详细的答案。那么你认为在我的模式中添加一个新键(例如(投票键)而不是嵌套在选择中会更好吗?然后我将所有投票选项添加到投票密钥中,并进行客户端数组匹配和长度以计算投票数。那个更好吗?因为毕竟投票数只需要在客户端显示。
    • @cusX 如果没有更多信息,您无法真正说出您真正想要的是什么。最好的提问当然是提出一个新问题,您可以在其中解释您想要回答的案例。
    猜你喜欢
    • 1970-01-01
    • 2020-12-17
    • 2015-10-07
    • 2020-12-21
    • 2020-02-24
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    相关资源
    最近更新 更多