Mongoose模型 - 更新数组

时间:2015-08-04 09:32:38

标签: node.js mongodb mongoose mongodb-query

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

        }
    });

这是民意调查的一个例子。假设我的数据库中有多个这些。

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

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

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

失败的方法:

Uncaught TypeError: Cannot read property 'top' of undefined

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

1 个答案:

答案 0 :(得分: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。)尽管其他问题也非常糟糕,因为它会调用读取数据并在代码中进行修改,然后“希望”在写回服务器之前没有其他任何内容改变数据。 / p>

除了单独使用 2 的那些问题外,当您只能使用 2时,它也会向服务器发出多个请求。