MongoDB GeoSpatial查询没有嵌入的纬度经度字段

时间:2012-04-04 14:48:18

标签: mongodb geocoding geospatial

我有一个非常大的数据库(约600万行),它是从csv文件导入的。 我正在查看MongoDB及其有关GeoSpatial索引的文档。您需要嵌入到数组中的纬度和经度字段。不幸的是,我导入的结构具有单独的字段。

“纬度”:54.770233,  “经度”:-6.537741,

是否有任何可能的方法来查询数据库,使用纬度54和经度-6来计算半径25英里内最近的二十个文件。

我在MySQL中创建了查询:

SELECT *,(3959 * ACOS(COS(RADIANS(54))* COS(RADIANS(latitude))* COS(RADIANS(longitude) - RADIANS(-6))+ SIN (RADIANS(54))* SIN(RADIANS(latitude))))AS距离 FROM table_name 距离<25 按距离排序 限制0,20,

但是,我不确定在没有嵌入字段的情况下如何在Mongo中执行此操作。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

我认为你不能。我会运行一个脚本来更新所有文档,这需要一段时间但不会太长。然后你可以按照惯例创建一个2d索引。

> db.test.insert({latitude:73,longitude:-47});
> db.test.insert({latitude:20,longitude:-30});
> db.test.find().forEach(function(doc) {
  doc.loc = [doc.longitude, doc.latitude];
  db.test.save(doc);
});
> db.test.find();
{ "_id" : ObjectId("4f7c63f117cd93783bba936d"), "latitude" : 73, "longitude" : -47, "loc" : [ 73, -47 ] }
{ "_id" : ObjectId("4f7c63f817cd93783bba936e"), "latitude" : 20, "longitude" : -30, "loc" : [ 20, -30 ] }

已更新实际上,我认为您可以使用where子句来执行此操作,但它不会使用任何索引。但如果它是一次性查询,那可能没问题。

db.test.find("( 3959 * Math.acos(Math.cos( 54 * 0.0174532925 ) * Math.cos( this.latitude * 0.0174532925 ) * Math.cos( this.longitude * 0.0174532925 ) - (-6 * 0.0174532925)) + Math.sin( 54 * 0.0174532925 ) * Math.sin( this.latitude * 0.0174532925 )) > 25 ");

这实际上不起作用 - 计算结果太大。我只是想复制你的数学,但有些事情一定不对。无论如何,按距离排序也是一个问题。我认为第一个解决方案更容易使用。