gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:37:37 24 4
gpt4 key购买 nike

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

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

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

我在 MySQL 中很好地创建了查询:

SELECT * , ( 3959 * ACOS( COS( RADIANS( 54 ) ) * COS( RADIANS( 纬度 ) ) * COS( RADIANS( longitude ) - RADIANS( -6 ) ) + SIN( RADIANS( 54 ) ) * SIN( RADIANS( latitude ) ) ) ) 作为距离FROM 表名距离<25按距离排序限制 0 , 20

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

如有任何帮助,我们将不胜感激。

最佳答案

我认为你做不到。我会运行一个脚本来检查并更新所有文档,这需要一段时间但不会太长。然后你可以像往常一样创建一个二维索引。

> 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 ");

这实际上行不通——计算结果太大了。我只是想复制你的数学,但一定是哪里不对。无论如何,按距离排序也会成为一个问题。我认为第一个解决方案更容易使用。

关于没有嵌入纬度经度字段的 MongoDB GeoSpatial 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10013579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com