2014-10-27 83 views
1

我有一个MongoDB的设置与文件这样我可以在MongoDB中按范围分组浮点数吗?

{ 
    "_id" : ObjectId("544ced7b9f40841ab8afec4e"), 
    "Measurement" : { 
     "Co2" : 38, 
     "Humidity" : 90 
    }, 
    "City" : "Antwerp", 
    "Datum" : ISODate("2014-10-01T23:13:00.000Z"), 
    "BikeId" : 26, 
    "GPS" : { 
     "Latitude" : 51.20711593206187, 
     "Longitude" : 4.424424413969158 
    } 
} 

现在,我试图通过日期和地点聚集他们,同时也测量的平均值添加到结果。到目前为止,我的代码如下所示:

db.stadsfietsen.aggregate([ 
    {$match: {"Measurement.Co2": {$gt: 0}}},  
    { 
     $group: { 
      _id: { 
       hour: {$hour: "$Datum"}, 
       Location: { 
        Long: "$GPS.Longitude", 
        Lat: "$GPS.Latitude" 
       } 
      }, 
      Average: {$avg: "$Measurement.Co2"} 
     } 
    }, 
    {$sort: {"_id": 1}}, 
    {$out: "Co2"} 
]); 

这给了我小时的所有可能的组合的一个不错的名单和GPS坐标,在这种形式:

{ 
    "_id" : { 
     "hour" : 0, 
     "Location" : { 
      "Long" : 3.424424413969158, 
      "Lat" : 51.20711593206187 
     } 
    }, 
    "Average" : 82 
} 

的问题是,有这么许多独特的坐标,它没有用。

当值相近时,可以将文档分组在一起吗?从经度51.207到经度51.209?

回答

1

$group中的范围没有标准支持。

数学

你可以计算出新的价值,这将是几geolocations相同。例如,你可以simulate a floor method

_id:{ hour:{$hour:"$Datum"}, Location:{ 
     Long: $GPS.Longitude - mod($GPS.Longitude, 0.01), 
     Lat: $GPS.Latitude - mod($GPS.Latitude, 0.01) 
}} 

地理空间索引

你可以重新调整你的应用程序使用Geospatial index和搜索在给定范围内的所有位置。如果这适用,则很大程度上取决于您的使用情况。

的map-reduce

Map-Reduce比聚合框架更加强大。你当然可以用它来做你的计算,但它更复杂,因此如果不花一个小时的时间,我就不能给你提供现成的解决方案。

+0

工作很好!地理空间索引对我无用,因为结果将用于热映射,所以我需要所有结果。 – Stybar 2014-10-27 21:51:50

相关问题