2014-03-12 35 views
1

我正在閱讀那個tutorial以瞭解如何獲取位於Google地圖多邊形抽屜中給定的多邊形內的文檔。MongoDB在多邊形中搜索所有具有lat和lng的文檔

該教程它存儲在像數組中的位置:

pos:{lat:xxx,lng:yyy} 

那不是我的情況,因爲我的文檔值存儲,如:

{... 
"hotel_lat":"xxx", 
"hotel_lng":"yyy", 
... 
}, 
{... 
"hotel_lat":"xxx", 
"hotel_lng":"yyy", 
... 
}, 
{... 
"hotel_lat":"xxx", 
"hotel_lng":"yyy", 
... 
}, 
... 

所以在教程它使用該查詢來查找多邊形中的所有文檔:

$query = array("pos" => array(
       '$within' => array('$polygon' => $poly))); 
$cursor = $collection->find($query); 

我將其更改爲:

$query = array(
array("hotel_lat","hotel_lng") => array(
'$within' => array('$polygon' => $poly))) 

,但它給了我這個錯誤:Illegal offset type in.....

可能是什麼錯誤?

謝謝!

回答

3

之前追捕進一步教程,我收集你在這種情況下這樣做,因爲你想要的東西用PHP編寫,MongoDB的網站有你需要的基本教程信息:

http://docs.mongodb.org/manual/tutorial/query-a-2d-index/

你說之前「這不是PHP」 再看看下面的代碼:

$result = '{"$pos": { "$within": { "$polygon": "$poly" } } }'; 
print_r(json_decode($result)); 

隨着輸出

stdClass Object 
(
    [$pos] => stdClass Object 
     (
      [$within] => stdClass Object 
       (
        [$polygon] => $poly 
       ) 

     ) 

) 

因此,您可以瞭解如何在PHP中編寫此代碼。相反,轉換爲JSON並查看您的編碼形式是否正確。

因此,您實際編寫的代碼甚至不是PHP的有效結構,更不用說脫離所需的語法了。

core documentation它解釋了您的存儲必須的樣子,並且在MongoDB中存儲的首選形式是陣列形式,以不同的語言,可能無法保持始終保持秩序一個 哈希所需的順序:

pos : [ <longitude> , <latitude> ] 

不能具有的「經度」和「緯度」的價值觀兩個獨立的領域,如MongoDB的不能在多個字段上創建所需的地理空間索引。你應該設法通過接收你的數據所在的數值在哪裏謹慎的字段中,那麼就由你來重塑那個數據爲MongoDB的正確存儲需求。

請先閱讀全部MongoDB documentation,然後再轉到其他教程任務。修復您的數據使其處於正確格式,並且索引爲必填字段。然後,您可以使用地理空間查詢。

並請定期在開發過程使用json_encodejson_decode,因爲它是比較文檔樣本和可視化,你正在做正確的事情非常明確的方式:

$poly = array(); 
array_push(
    $poly, floatval(51.52081391707402), floatval(-0.12737274169921875), 
    floatval(51.487582985843034), floatval(-0.13578414916992188)); 

$test = array("pos" => array('$within' => array('$polygon' => $poly))); 
echo json_encode($test, JSON_PRETTY_PRINT) ."\n" 

,導致:

{ 
    "pos": { 
     "$within": { 
      "$polygon": [ 
       51.520813917074, 
       -0.12737274169922, 
       51.487582985843, 
       -0.13578414916992 
      ] 
     } 
    } 
} 

作爲結構如何的JSON表示實際上傳輸到服務器c倒轉爲BSON。

+0

非常感謝您的迴應!我將我的字段轉換爲匹配mongoDB索引,並且所有工作都很好。再次感謝你! – JackTurky

相關問題