2012-01-04 41 views
3

嘗試設置爲在MongoDB上使用地理空間索引時,遇到錯誤消息,位置數組的格式不正確。MongoDB:地理空間索引數組格式不正確

這是我的收藏「測試」。

{ 
    "_id" : ObjectId("4f037ac176d6fdab5b00000a"), 
    "CorporateId" : "XYZ12345", 
    "Places" : [ 
      { 

        "Location" : { 
          "Longitude" : "50.0", 
          "Latitude" : "50.0" 
        }, 
        "ValidFrom" : "2011-11-01 00:00:00", 
        "ValidTo" : "2021-12-31 00:00:00", 
        "itemCount" : "1" 
      } 
    ] 
} 

一旦我運行此代碼。

db.test.ensureIndex({"Places.Location": "2d"}); 

我收到此錯誤信息

位置對象預計,位置排列的格式不正確

我的假設是,朗/緯度必須是數字。 目前它是一個對象。

typeof db.test.Places.Location.Longitude -> Object 
typeof db.test.Places.Location -> Object 

我的問題是,既然我仍然很新的MongoDB的,我真的不知道如何以最佳的方式解決這個問題。

+0

您使用的是什麼客戶端應用程序? – 2012-01-04 03:42:54

+0

是的,它需要是一個數字。 – 2012-01-04 03:44:36

回答

10

Mongodb預計在傳遞字符串時座標的數字。

"Location" : { 
         "Longitude" : 50.0, // <<<<<<<<<<<<<< use numbers instead 
         "Latitude" : 50.0 
       }, 

有關詳細信息,請參見http://www.mongodb.org/display/DOCS/Geospatial+Indexing

+0

感謝您的快速幫助。有沒有一種方法可以強制收藏將其作爲數字插入? – user1094824 2012-01-04 03:56:48

+0

您可以使用'parseFloat()'在插入前將座標轉換爲數字。 – qiao 2012-01-04 04:00:36

+0

我的問題是插入例程基本上只是將序列化的json數組保存到數據庫中。這意味着我必須在插入之前解析JSON字符串。請原諒我缺乏知識,這是推薦的方法嗎? – user1094824 2012-01-04 04:43:19

0

通過將Location參數轉換爲像這樣的float類型,可以解決問題。

$var = $JSonString['Places']; 
$test=count($var); 

$i=0; 
for ($i=0; $i<$test;$i++){ 
     $lon = (float)$JSonString['Places'][$i]['Location']['Longitude']; 
     $lat = (float)$JSonString['Places'][$i]['Location']['Latitude']; 
     $JSonString['Places'][$i]['Location']['Longitude'] =$lon ; 
     $JSonString['Places'][$i]['Location']['Latitude'] =$lat ; 
     //error_log($lon . "->".gettype($JSonString['Places'][$i]['Location']['Latitude']), 3 , "/var/tmp/my-errors.log"); 
}