要有效期爲"geospatial query"「位置」必須相交在經度,緯度訂單,不能包含任何其他座標。
有效格式是
{
"location": [long,lat]
}
或者
{
"location": { "lng": long, "lat": lat }
}
或者以GeoJSON
{
"location": {
"type": "Point",
"coordinates": [long,lat]
}
}
另一個字段,如 「半徑」 是 「另一場」 和不能成爲其中的一部分相同的數組。
理想遵循GeoJSON的:
{
"location": {
"type": "Point",
"coordinates": [long,lat]
},
"radius": radius
}
其中在貓鼬的模式定義可以是簡單的:
var geoSchema = new Schema({
"location": {
"type": String,
"coordinates": []
},
"radius": Number
});
當與真正的「地球」地理空間數據處理座標的指數應該是"2dsphere",您可以選擇在模式上定義爲:
geoSchema.index({ "location": "2dsphere" })
由於在支持的GeoJSON中沒有對「圓」對象的實際支持,因此建議將另一個字段保留爲「半徑」並存儲「中心點」。
與其他「傳統座標對」格式相比,GeoJSON的「巨大」優勢是當通過geoNear
或$geoNear
從某點返回類似「距離」的東西時,該「距離」在「米」中一致定義。這也是您應該如何定義存儲中的任何「半徑」值以與該結果保持一致。
對於其他存儲格式,則結果以「弧度」返回,您可能想要轉換結果並且不希望存儲具有該結果的圓的「半徑」作爲度量值。
你解決這個問題的辦法是,考慮到這種形式的數據:
{
"locationtype": "circle",
"location": {
"type": "Point",
"coordinates": [1,1]
},
"radius": 4
}
然後使用.aggregate()
一個$geoNear
級和$redact
過濾:
db.collection.aggregate([
// Find points or objects "near" and project the distance
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [2,2]
},
"distanceField": "distance",
"query": { "locationType": "circle" }
}},
// Logically filter anything outside of the radius
{ "$redact": {
"$cond": {
"if": { "$gt": [ "$distance", "$radius" ] },
"then": "$$PRUNE",
"else": "$$KEEP"
}
}}
])
現在使用的值在查詢示例中僅僅是一個示例,但是如「真實」經度和緯度座標所述,「距離」屬性按照設計和在前面提到的「米」容差範圍內工作。
這裏的要點是,$geoNear
都會發現「接近」「圓」中心點,無論對象類型是什麼。不僅如此,這裏的命令還在文檔中生成另一個字段的「投影」,如「distanceField」中所示。這表示與「米」中的圓圈「中心」的距離。
這裏的第二階段使用$redact
,因爲它有點像一個$project
和$match
流水線階段之一。與$match
不同,該操作員可以通過比較文檔中出現的字段來評估「邏輯」條件。在這種情況下,像$$PRUNE
這樣的操作將匹配的文檔移至「if」條件,其中true
和「從結果中」除去條件爲false
的文檔。簡而言之,如果「距離」是「大於」,那麼「圓」的「半徑」,那麼對象「位於」圓外並且不「相交」。否則「它確實」。
所以這是的「,其定義爲幾何形狀的‘圓圈’集合中與‘用它’來實現的東西像之間的交叉點‘圈’內的或其他類型的對象‘點的基本知識’半徑
MongoDB具有內置支持,請閱讀http://docs.mongodb.org/manual/applications/geospatial-indexes/ – marekful