我正在尝试使用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背景,因此这个基于文档的数据库系统有点令人困惑。感谢
答案 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