Mongoose findOneAndUpdate正确使用

时间:2016-05-05 18:50:57

标签: node.js express mongoose

我正在尝试使用Express和Mongoose自学Node.js。

我正在处理的网站部分是一个投票系统,除了一小部分(虽然相当重要的部分)跟踪用户投票之外,我已经完成了所有工作......

我有一个包含此代码的轮询处理程序

pollVote : function(req, res, next) { //needs poll name, user, and their vote
    Polls.findOne({'active' : true},  function(err, poll) {
        if(err)
            throw err;

        if(poll) {
            if(poll.users.indexOf(req.user.userData.username) > -1) {
                req.polls.response = "You have already voted...";
                next();
            } else {
                var index = poll.labels.indexOf(req.polls.vote);
                var voteIndex = {};
                voteIndex['votes.' + index];
                var query = {'active' : true};
                var update = {$inc : {voteIndex : 1}, $push : {users : req.user.userData.username}};
                var options = {};
                Polls.findOneAndUpdate(query, update, options, function(err, poll){
                    if(err)
                        throw err;
                    req.polls.response = "Voted";
                    next();
                });


            }           
        } else {
            req.polls.response = "FAILED";
            next();
        }
    });
},

prepVote : function(req, res, next) {
    var data = req.body.stringData;
    data = data.split(',');
    var name = data[0];
    var vote = data[1];
    req.polls = {
        name : name,
        vote : vote,
        response : ""
    }
    next();

},

我的路由器就像这样调用

app.post('/poll-vote', requestedOn, isLoggedIn, pollHandler.prepVote, pollHandler.pollVote, function(req, res) {
    res.send(req.polls.response);
});

我的Mongoose Schema是这样的

var mongoose = require('mongoose');

var pollSchema = mongoose.Schema({
name        : String,
active      : Boolean,
users       : [String],
labels      : [String], 
votes       : [Number],
answerDesc  : [String],
created     : Date,
deactivated : Date

});

module.exports = mongoose.model('Polls', pollSchema);

当我尝试投票时,我得到了一个MongoError声明" ' $ INC'是空的。您必须指定如下字段:{$ inc:{<字段>:...}}然而,我是如何设置它的?

我在这里和Mongoose API上搜索了不少不同的条目。我原本试图通过保存来做到这一点,但它并没有保存我的更改。

我来自SQL背景,因此这个基于文档的数据库系统有点令人困惑。感谢

1 个答案:

答案 0 :(得分:1)

如果您想在votes字段中增加子字段,则可以使用MongoDB指定的dot notation

  

<强> $ INC

     

$ inc运算符按指定值递增字段,其格式如下:

     

{ $inc: { <field1>: <amount1>, <field2>: <amount2>, ... } }

     

要在嵌入文档或数组中指定a,请使用点符号

请参阅此示例,了解点符号$inc的使用情况。

db.products.update(
   { sku: "abc123" },
   { $inc: { quantity: -2, "metrics.orders": 1 } }
)

问题在于您如何指定点符号。您不能使用var voteIndex = 'votes.' + index因为在对象文字语法中不能使用常量字符串以外的任何内容。

您有两种选择:

1)对于包含Node.js规范部分内容的EMCAScript 2015 (ES6)的较新版本,您可以使用[exp]: value语法,如下所示。

var update = {$inc : {["votes.${index}"] : 1}, $push : {users : req.user.userData.username}};

2)在Node.js的旧版本中,您可以在Object使用$inc之前创建var index = poll.labels.indexOf(req.polls.vote); var voteIndex = {}; voteIndex['votes.' + index] = 1; var query = {'active' : true}; var update = {$inc : voteIndex, $push : {users : req.user.userData.username}};

override func update