2017-04-05 63 views
0

嗨,我正在開發MeteorJS應用程序,我堅持更新子數組元素。查找並替換MongoDB中的子數組元素

這是一個民意調查應用程序,我有以下的數據庫結構:

在每道題有選擇,當用戶點擊一個選項的按鈕,我想增加選項,這個選項的投票通過一個與每個用戶每個問題應該擁有一票權利。

從按鈕,我傳遞名稱和questionId數據,以找到正確的選項來增加投票。我應該用questionId找到具體問題,然後在Options下找到具有名稱的特定數組。

我卡在哪裏是我無法找到它。

請幫幫忙,謝謝

集合名稱:民意調查

每個投票的結構如下:

{ 
 
    "_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

你可以用$和執行邏輯AND對兩個或更多表達式的數組進行操作。

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

第一個表達式在這裏將獲得與questionId的問題。

'question.questionId': "xgYQxGxpwBXaQpjXN" 

而第二個表達式指定與選項數組中匹配名稱的對象。 要在options數組中找到名稱爲object的對象,可以使用$ elemMatch,它允許指定查詢。

{ <field>: { $elemMatch: { <query1>, <query2>, ... } } } 

獲取options數組中名稱爲「John」的對象。

'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