2014-05-06 33 views
0

所有的實例和蒙戈地理搜索的實現,我已經能夠找到,使用一個數組屬性[lng, lat]執行的搜索:如何對兩個屬性進行地理搜索而不是[lng,lat]數組?

的示例記錄是:

{ 
    name: 'foo bar', 
    locations: [ 
    { 
     name: 'franks house', 
     geo: [-0.12, 34.51] 
    }, 
    { 
     name: 'jennifers house', 
     geo: [-0.09, 32.17] 
    } 
    ] 
} 

,並將所得的查詢:

db.events.find({ 'locations.geo': { $nearSphere: [ -0.12, 34.51 ], $maxDistance: 0.02 }}) 

這工作得很好,但記錄的格式也不是很大,爲用戶讀或寫,因爲它不是自我記錄,其中latlng進入該陣列。有陷阱的餘地。我想讓這些記錄更加人性化:

{ 
    name: 'foo bar', 
    locations: [ 
    { 
     name: 'franks house', 
     lat: 34.51, 
     lng: -0.12 
    }, 
    { 
     name: 'jennifers house', 
     lat: 32.17, 
     lng: -0.09 
    } 
    ] 
} 

對於這種類型的記錄,生成的mongo查詢會是什麼樣子?我一直無法找到任何這樣的例子,所以我想知道是否有可能。

+0

如果你想用你給蒙戈地理運營商保持[LON,LAT]格式。無論如何,只是一個側面說明,通常'用戶'不應該直接從數據庫中讀取/寫入(MVC?)。 – joao

+0

這是一個REST API,我需要最簡單的方法來返回JSON結果。它不需要完全像數據庫結構,但我必須做的數據格式越少響應時間就越快。 –

回答

1

建議不要在經度和緯度上使用單獨的字段。 2dsphere索引用於索引需要一系列座標的地理空間數據,請參閱documentation。這是您無法找到單獨座標字段示例的原因。

您應該將表示與數據存儲分開。僅僅因爲座標存儲在數組中,您不一定需要將它們作爲數組呈現給用戶。例如,你可以使用上保存到存儲陣列中的各個參數,像前撥打電話:

var schema = new Schema(..); 
schema.pre('save', function (next) { 
    this.coordinates = [this.longitude, this.latitude] 
    next(); 
}); 
+0

是的,這是我的第二選擇,但我想先檢查一下。您的答案几乎全面,但我用這種方法解決的一個問題是如何獲取結果並輕鬆轉換回用戶友好的數據結構。我無法在Mongoose中找到任何像'schema.post('find',...'或其他東西,你能詳細說明嗎? –

+0

'schema.post('init','should work:http://mongoosejs.com /docs/middleware.html –

+0

因此,對doc對象所做的任何修改都將應用於所有對象結果,無論何時執行查詢並返回? –

相關問題