在ArangoDB中定义地理索引

时间:2016-05-14 10:43:28

标签: geolocation location arangodb aql

我有一个如下所示的数据结构。如何为该结构定义地理索引?

{
  "currentGeoLocation": {
    "latitude": -10,
    "longitude": 1
  }
}

我试过这些命令: 1 -

db.test.ensureIndex({ type: "geo", fields: [ "currentGeoLocation[latitude]","currentGeoLocation[longitude]" ] }); 

2 -

 db.test.ensureIndex({ type: "geo", fields: [ "currentGeoLocation.latitude","currentGeoLocation.longitude" ] }); 

但我认为没有一个正常。因为在我搜索最近的物品后,我得到了[]。 这个问题是什么?

2 个答案:

答案 0 :(得分:3)

您的第二个索引创建是正确的。

必须知道,纬度和经度不是实际公里单位。在a distance calculator中输入[-10, 1](这也是关于计算详情的一个很好的读物)会告诉您1117 km远离[0,0]。由于ArangoDB中半径的单位为m,因此数字会变大。

在实际位置搜索肯定会找到您的项目:

db._query('FOR item IN WITHIN(test, -10, 1, 1) RETURN item').toArray()

但是,从[0,0]搜索需要更大的半径:

db._query('FOR item IN WITHIN(test, 0, 0, 1200000) RETURN item').toArray()
[ 
  { 
    "_key" : "840", 
    "_id" : "test/840", 
    "_rev" : "840", 
    "currentGeoLocation" : { 
      "latitude" : -10, 
      "longitude" : 1 
    } 
  } 
]

答案 1 :(得分:1)

继上一个回答之后,您使用的是arangosh界面还是arangodb js?

我问,因为arangodb js界面不同。在这种情况下,你会看到类似的东西:

db.collection('testnodes').createGeoIndex(['currentGeoLocation.latitude', 'currentGeoLocation.longitude'])

此外,arangodb会带来许多非常有用的地理位置功能(靠近,内部等),它们具有辅助功能以自动计算距离。