2017-04-05 92 views
0

こんにちは私はMeteorJSアプリケーションを開発しています。MongoDBのサブ配列要素を検索して置き換えます

それは、ポーリングアプリケーションであり、私は次のデータベース構造を持っている:そこのオプションがあり、ユーザがオプションのボタンをクリックしたときに、私は1つ、すべてのユーザーがそのオプションの票をインクリメントしたい各質問の下に

を各質問に対して1つの投票権を持つべきです。

ボタンから、投票を増やすための適切なオプションを見つけるためにnameとquestionIdデータを渡します。私はquestionIdで特定の質問を見つけて、オプションの下にある名前を持つ特定の配列を見つけます。

ここで私は立ち往生していますが、私はそれを見つけることができません。

、感謝

コレクション名助けてください:投票

を各ポーリングには、以下の構造を有する:

{ 
 
    "_id" : "uJtBt8mM2pbTYfwND", 
 
    "createdAt" : ISODate("2017-04-03T22:40:14.678Z"), 
 
    "pollName" : "First Poll", 
 
    "entryOwner" : "gdAHxDrxFuTvYiFt8", 
 
    "question" : [ 
 
     { 
 
      "name" : "Question number 1", 
 
      "questionId" : "xgYQxGxpwBXaQpjXN", 
 
      "options" : [ 
 
       { 
 
        "name" : "John", 
 
        "votes" : 0 
 
       }, 
 
       { 
 
        "name" : "Adam", 
 
        "votes" : 0 
 
       }, 
 
       { 
 
        "name" : "Robert", 
 
        "votes" : 0 
 
       } 
 
      ] 
 
     }, 
 
     { 
 
      "name" : "Question number 2", 
 
      "questionId" : "zviwYHHsaATBdG6Jw", 
 
      "options" : [ 
 
       { 
 
        "name" : "John", 
 
        "votes" : 0 
 
       }, 
 
       { 
 
        "name" : "Adam", 
 
        "votes" : 0 
 
       }, 
 
       { 
 
        "name" : "Robert", 
 
        "votes" : 0 
 
       } 
 
      ] 
 
     } 
 
    ], 
 
}

答えて

1

をあなたは$を使用して、論理を実行することができ、 2つ以上の式の配列に対する操作。

{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] } 

最初の表現はquestionIdで質問を得ることです。

'question.questionId': "xgYQxGxpwBXaQpjXN" 

とオプションの配列内の名前に一致するオブジェクトを指定するための第二の発現。 options配列内の名前を持つオブジェクトを検索するには、クエリを指定できる$ elemMatchを使用します。

"John"という名前のoptions配列でオブジェクトを取得するには

'question.options': { 
    $elemMatch: { 
     name: "John" 
    } 
} 

最後に、$ incを使用して投票を増やします(ここでは1)。 最初に一致する要素($付き)を取得します。

'question.options.$.votes': 1 

はここで完全なコードです:

db.Polls.update({ 
    $and: [{ 
      'question.questionId': "xgYQxGxpwBXaQpjXN" 
     }, 
     { 
      'question.options': { 
       $elemMatch: { 
        name: "John" 
       } 
      } 
     } 
    ] 
}, { 
    $inc: { 
     'question.options.$.votes': 1 
    } 
}) 
+0

スタックオーバーフローで、それはコードを書くには十分ではありません。注釈をつけてコードを説明してください。 –

+1

更新されました。 –

+0

このコードを実行すると、質問のインデックスがわからないため、投票を更新できないという問題点があります。私はunderscore.jsライブラリをインストールし、ボタンがクリックされたときに各アイテムのインデックスを見つけることでこれを解決しました。 – picacode

関連する問題