我的情况: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();
}
实际上,您实际上正在询问MongoDB目前无法执行的“两个”操作,即同时更新多个数组元素并根据现有内容进行修改。 MongoDB的下一个版本(截至编写时)可以处理多个数组元素,但还没有。如果它总是简单地用'1'表示,或者对于所有匹配的元素都是一致的,那么你也可以避开这个“那么”。现在,你最好使用单独的文档而不是数组成员,在这里你可以改变每个文档中的“$ inc”值。 –