2015-07-13 53 views
0

我有如下因素代碼來定義一個模式:如何爲mongo數據庫模式定義一個圓?

var mongoose=require('mongoose'); 
var Schema=mongoose.Schema; 
var PostSchema=new Schema({ 
location:{type:Array,required:false,select:true} 
}) 
PostSchema.index({location:'2dsphere'}); 

module.exports=mongoose.model('Post',PostSchema);

我要讓位置字段被視爲就像一個圓圈(例如:位置:{LOC:[緯度,經度]半徑:半徑})..我想進行查詢找到的圓圈組成我的數據庫其間用polygon.Thanks任何幫助:)

+0

MongoDB具有內置支持,請閱讀http://docs.mongodb.org/manual/applications/geospatial-indexes/ – marekful

回答

4

要有效期爲"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的文檔。簡而言之,如果「距離」是「大於」,那麼「圓」的「半徑」,那麼對象「位於」圓外並且不「相交」。否則「它確實」。


所以這是的「,其定義爲幾何形狀的‘圓圈’集合中與‘用它’來實現的東西像之間的交叉點‘圈’內的或其他類型的對象‘點的基本知識’半徑

相關問題