我有一个具有相同固定大小的几个数组的模型,我一直试图弄清楚我是否可以使用聚合管道对数组索引求和,但是一直很难找到任何有用的东西
例如:
{
label: "label1",
A: [0, 0, 0],
B: [1, 1, 1],
C: [0, 0, 1],
etc: ... ,
}
需要在投影期间生成以下求和数组,或者在标签键上进一步向下划分管道时生成另一个类似数组:
{
Z: [1, 1, 2]
}
使用Mongo 3.2我可以展开数组并维护其索引,但我仍然不确定如何使用这些索引和值重建数组。
如果有人有任何想法或建议,那将意味着很多。提前感谢您的回复。
答案 0 :(得分:1)
如果它是一个小尺寸(3x3意味着9个操作),可以使用$ slice切片数组,但展开它将为3x3数组生成27个文档,因此连接它们是一种痛苦。
或者您可以使用forEach
来使用更简单的解决方案var arraySize=3;
var a=[];
db.david.find({label:"label2"}).forEach(function(myDoc) {
for(var i=0;i<arraySize;i++){
a[i]=myDoc.A[i]+myDoc.B[i]+myDoc.C[i];
}
})
printjson( a )
<强> 修改 强>
我仍然不确定如何以更动态的方式咬这个 - 但这是一种针对3个阵列的提议,每个3个元素。
var arraySumprojection = {
$project : {
col1 : {
$let : {
vars : {
a : {
"$arrayElemAt" : ["$A", 0]
},
b : {
"$arrayElemAt" : ["$B", 0]
},
c : {
"$arrayElemAt" : ["$C", 0]
},
},
in : {
$add : ["$$a", "$$b","$$c"]
}
}
},
col2 : {
$let : {
vars : {
a : {
"$arrayElemAt" : ["$A", 1]
},
b : {
"$arrayElemAt" : ["$B", 1]
},
c : {
"$arrayElemAt" : ["$C", 1]
},
},
in : {
$add : ["$$a", "$$b","$$c"]
}
}
},
col3 : {
$let : {
vars : {
a : {
"$arrayElemAt" : ["$A", 2]
},
b : {
"$arrayElemAt" : ["$B", 2]
},
c : {
"$arrayElemAt" : ["$C", 2]
},
},
in : {
$add : ["$$a", "$$b","$$c"]
}
}
},
}
}
])