2014-04-25 47 views
1

我需要搜索框中的所有點。所以我用下面的查詢MongoDB中

db.places.find({ 
    "loc" : { 
     "$geoWithin" : { 
      "$box": [ 
       [ 0 , 0 ] , 
       [ 100 , 100 ] 
      ] 
     } 
    } 
}) 

現在我必須要內搜查多個盒子,我想所有的謊言在任意框中的點。我想是這樣

db.places.find({ 
    "loc": { 
     "$geoWithin": { 
      "$box":[ [ 0 , 0 ], [ 25 , 25 ] ], 
       [ [ 40 , 40 ] , [ 75 , 75 ] ], 
       [ [ 90 , 90 ] , [ 100 , 100 ] ] 
     } 
    } 
}) 

我不能使用$or作爲其確實短路計算。我不能使用彙總,因爲只有$geonear支持彙總。我不想爲每個盒子打一個單獨的查詢。請建議。

回答

1

有一些「快捷方式」類型的操作符可用於預定義的「地理」類型查詢,如$box。但對於什麼更高級的你實際上會想正式宣佈GeoJSON的結構和使用$geometry操盤手:

所以,如果你考慮以下文件:

{ "loc" : { "type" : "Point", "coordinates" : [ 3, 6 ] } } 
{ "loc" : { "type" : "Point", "coordinates" : [ 9, 12 ] } } 
{ "loc" : { "type" : "Point", "coordinates" : [ 45, 45 ] } } 
{ "loc" : { "type" : "Point", "coordinates" : [ 30, 30 ] } } 
{ "loc" : { "type" : "Point", "coordinates" : [ 76, 76 ] } } 

與當時的下面的查詢:

db.geo.find({ 
    "loc": { 
     "$geoWithin": { 
      "$geometry":{ 
       "type": "MultiPolygon", 
       "coordinates": [ 
        [[ [ 0, 0 ], [ 0, 25 ], [ 25, 25 ], [ 25, 0 ], [ 0, 0 ] ]], 
        [[ [ 40, 40 ], [ 40, 75 ], [ 75, 75 ], [ 75, 40 ], [ 40, 40 ] ]], 
        [[ [ 80, 80 ], [ 80, 90 ], [ 90, 90 ], [ 90, 80 ], [ 80, 80 ] ]] 
       ] 
      } 
     } 
    } 
}) 

,你會得到返回的結果:

{ "loc" : { "type" : "Point", "coordinates" : [ 3, 6 ] } } 
{ "loc" : { "type" : "Point", "coordinates" : [ 9, 12 ] } } 
{ "loc" : { "type" : "Point", "coordinates" : [ 45, 45 ] } } 

因此,對這種類型的查詢需要完全支持GeoJSON幾何。

這絕對適用於MongoDB 2.6,2.4.10也是如此。擴展的GeoJSON類型可用於這些發佈版本的索引,但(未嘗試)可能在早期的2.4版本中用作查詢表單。

相關問題