2017-10-21 55 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特别要求“基于**现有的**文档内容进行修改,这基本上要求”一次更新多个数组项“。**两个**操作目前都不可能在原子请求中使用。 –