2016-05-05 11 views
0

私はExpressとMongooseを使ってNode.jsを教えようとしています。マングース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); 
}); 

マイマングーススキーマのように私のルータによって呼び出され、このコードが含まれています

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

投票しようとすると、「 '$ inc」が空であることを示すMongoErrorが表示されます。あなたは次のようなフィールドを指定する必要があります:{$ inc:{< field>:...}}しかし、それで私はそれをどのように設定しましたか?

ここでは、Mongoose APIとはかなり異なる項目を探しました。もともと私は保存でこれをやろうとしていましたが、私の変更を保存していませんでした。

私はSQLのバックグラウンドから来たので、このドキュメントベースのDBシステムはちょっと混乱しています。ありがとう

+0

「voteIndex」ではなく「votes」を増やすことを意味しますか? 'pollIn'はあなたのスキーマの' Poll'モデルではありません。 – roflmyeggo

+0

@roflmyeggo voteIndexは私が[votes]に設定した変数です。 + index] indexは、ユーザーが投票で選択したラベルのindexOfです。 –

+0

'$ inc'は、見つかった文書のデータベースのフィールドをインクリメントするために使用されます。これは 'findOneAndUpdate'の関数です。 :) – roflmyeggo

答えて

1

votesフィールドのサブフィールドを増やしたい場合は、MongoDBが指定するdot notationを使用できます。

$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を使用することはできません。これは、オブジェクトリテラル構文で定数文字列以外を使用できないためです。

次の2つのオプションがあります。

1)以下に示すように、あなたが[exp]: value構文を使用することができますEMCAScript 2015 (ES6)仕様の一部を組み込むNode.jsの新しいバージョンでは。 Node.js

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

2)では、古いバージョンでは、あなたは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 so close ...私は変更を加え、それは動作しようとしていたように見えました。 は{$ inc:{["votes。$ {index}"]:1}のように見えますが、エラーを受け取ります:部品(投票数$ {index})を使用して要素をトラバースすることはできません[0、0]}) –

+0

もう1人がやった!ちょうど3週間前にnode.jsをダウンロードしましたが、それはすでに古くなっていたのでしょうか?あなたの助けと忍耐に感謝します。 –

関連する問題