2017-10-21 86 views
0

我的情況:MongoDB上的矢量添加

我有一個只有絕對頻率結果數組的問題的小文檔。 (陣列的長度==問題選擇的數量)

例如,

{ 
    _id: '<id>', 
    resultArray: [0,0,0,0,0] 
} 

回答一個問題會給我一個相同長度的布爾數組。

例如

answerResultArray: [0,0,1,1,0] 

對於更新絕對的結果,我需要[I] 1,如果answerResultArray [I] ==真像做doc.resultArray + = answerResultArray 或遞增doc.resultArray。

如何在不讀取文檔的情況下在MongoDB上執行此操作?


我的解決方案:

它看起來真的錯了,但它的作品...

更新文檔類的。

db.myCollection.update(
    { _id: ObjectId(<id>)}, 
    {$inc: {"resultArray.0": NumberInt(1), "resultArray.5": NumberInt(1), <...> } }) 

並構建一個json對象(inc)進行更新。

function incrementAbsoluteResults(absoluteResultId, resultArray){ 
    let inc = {}; 
    for(let i = 0; i < resultArray.length; ++i){ 
     const str = "resultArray." + i; 
     if(resultArray[i]) inc[str] = 1; 
    } 

    return QuestionResultAbsolute.update(
     {_id: absoluteResultId}, 
     { $inc: inc } 
    ).exec(); 
} 
+0

實際上,您實際上正在詢問MongoDB目前無法執行的「兩個」操作,即同時更新多個數組元素並根據現有內容進行修改。 MongoDB的下一個版本(截至編寫時)可以處理多個數組元素,但還沒有。如果它總是簡單地用'1'表示,或者對於所有匹配的元素都是一致的,那麼你也可以避開這個「那麼」。現在,你最好使用單獨的文檔而不是數組成員,在這裏你可以改變每個文檔中的「$ inc」值。 –

回答

0

$推動$每個運營商可以使用更新。這樣的命令基本上將數據庫中的數組與您的向量合併。

db.yourCollection.update(
    { _id: '<id>' }, 
    { $push: {resultArray: {$each: [0,0,1,1,0] }} } 
) 
+0

這不是一個「合併」,它是一個「追加」。 OP特別要求「基於**現有的**文檔內容進行修改,這基本上要求」一次更新多個數組項「。**兩個**操作目前都不可能在原子請求中使用。 –