3

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

Document structure

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

因此,我尝试通过像这样查询集合来计算整个文档集合的myCoordinates数组的myLngmyLat值的平均值:

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

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

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

4

1 回答 1

7

聚合中的位置符号似乎仍然不受支持,请查看这张票

正如@Sammaye 所说,您需要先展开数组,或者将坐标数组替换为嵌入式lng/lat嵌入式文档,这会使这变得微不足道。

给定数组结构,您可以像这样展开和投影 lat/lng:

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"}
 }}
]);
于 2013-06-25T17:51:03.130 回答