2016-05-05 4 views
0

Я пытаюсь научить себя Node.js с помощью Express и Mongoose.Mongoose findOneAndUpdate надлежащее использование

Часть сайта, я работаю система опроса, и я получил все работает, кроме одной маленькой (хотя и довольно важная часть) отслеживания пользователей голосов ...

У меня есть обработчик опроса который содержит этот код

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 схемы, как так

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: {< field>: ...}} Однако, как я его настроил?

Я прочел здесь несколько разных записей и API Mongoose. Сначала я пытался сделать это с сохранением, но это не спасло мои изменения.

Я исхожу из фона SQL, поэтому эта система на основе документов немного запутанна. Thanks

+0

Вы хотите увеличить «голосов» вместо 'voteIndex'? 'voteIndex' не входит в вашу схему для модели« Опрос ». – roflmyeggo

+0

@roflmyeggo voteIndex - это переменная, которую я задал для ['голосов.' + index], где index - indexOf метка, выбранная пользователем в опросе. –

+0

'$ inc' используется для увеличения поля в базе данных по найденному документу. Это функция 'findOneAndUpdate'. :) – roflmyeggo

ответ

1

Если вы хотите увеличить количество подполей в поле votes, то вы можете использовать dot notation, указанный MongoDB.

$inc

The $inc operator increments a field by a specified value and has the following form:

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

To specify a in an embedded document or in an array, use dot notation.

Смотрите этот пример в отношении использования обозначений точки с $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}}; 
+0

gah так близко ... Я внес изменения, и похоже, что он вот-вот сработает. выглядит как {$ inc: {["голосов. $ {Index}"]: 1} теперь, однако, я получаю ошибку: не могу использовать часть (голосов голосов. $ {Index}) для прохождения элемента ({голосов: [0, 0]}) –

+0

Второй сделал это! хотя я загрузил node.js всего три недели назад, странно, что он уже устарел? Большое спасибо за вашу помощь и терпение –

Смежные вопросы