2014-10-27 99 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