2013-06-25 146 views
2

我正在尝试计算集合中每个文档的每个数组值的平均聚合操作。mongoDB - 数组值的平均值

Document structure 

{ 
    myVar: myValue, 
    [...] 
    myCoordinates: [ 
     myLng, 
     myLat 
    ] 
} 

所以,我想通过查询这样的集合来计算myLngmyLat的myCoordinates阵列的文件全收集值的平均值为:

myColl.aggregate([{ 
    $group: { 
     _id: 0, 
     lngAvg: { $avg: "$myCoordinates.0" }, 
     latAvg: { $avg: "$myCoordinates.1" } 
    } 
}]) 

但不幸的是,它不起作用,并为lngAvglatAvg字段返回值0。

你有什么想法吗?至少这是否可行?

+0

我认为你需要$放松文件第一 – Sammaye

回答

5

聚合中的位置表示法似乎仍不受支持,check out this ticket

正如@Sammaye所说的,您需要首先展开阵列,或者使用嵌入式文档替换您的坐标阵列,这会使得这种微不足道。

鉴于阵列结构,你可能会放松和投影纬度/经度这样的:

myColl.aggregate([ 
// unwind the coordinates into separate docs 
{$unwind: "$myCoordinates"}, 

// group back into single docs, projecting the first and last 
// coordinates as lng and lat, respectively 
{$group: { 
    _id: "$_id", 
    lng: {$first: "$myCoordinates"}, 
    lat: {$last: "$myCoordinates"} 
}}, 

// then group as normal for the averaging 
{$group: { 
    _id: 0, 
    lngAvg: {$avg: "$lng"}, 
    latAvg: {$avg: "$lat"} 
}} 
]); 
+0

感谢您的帮助,我会调整我与你查询它的工作原理! :) 不幸的是,因为我使用了2d地理索引,所以我无法使用'lng' /'lat'文件。 我很担心通过在数组上使用unwind操作符来丢失对根文档的任何引用,但它似乎通过用每个值替换数组来返回根文档的副本。 我希望他们能尽快修正聚合中的位置表示法,以简化2d地理索引的聚合操作。 –

+0

[根据文档](http://docs.mongodb.org/manual/core/geospatial-indexes/#multi-location-documents-for-2d-indexes),地理空间索引应该已经在'lng'/'lat'嵌入式文档。 – numbers1311407