在聚合管道

时间:2016-05-26 23:30:02

标签: arrays mongodb mongoose

我有一个具有相同固定大小的几个数组的模型,我一直试图弄清楚我是否可以使用聚合管道对数组索引求和,但是一直很难找到任何有用的东西

例如:

{  
    label: "label1",

    A: [0, 0, 0],   
    B: [1, 1, 1],  
    C: [0, 0, 1],

    etc: ... ,
}

需要在投影期间生成以下求和数组,或者在标签键上进一步向下划分管道时生成另一个类似数组:

{  
    Z: [1, 1, 2]  
}  

使用Mongo 3.2我可以展开数组并维护其索引,但我仍然不确定如何使用这些索引和值重建数组。

如果有人有任何想法或建议,那将意味着很多。提前感谢您的回复。

1 个答案:

答案 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"]
                        }
                    }
                },
            }
        }
    ])