当前位置: 首页 > 知识库问答 >
问题:

MongoDB“无法找到$geoNear查询的索引”

柳项明
2023-03-14

我只是想让一个简单的靠近查询正常工作。这是我的文档html" target="_blank">示例。

{"point": 
  {"type": "Point", 
     "coordinates": [30.443902444762696, -84.27326978424058]}, 
   "created_on": {"$date": 1398016710168}, 
   "radius": 180, 
   "user": {"$oid": "53543188eebc5c0cc416b77c"}, 
   "_id": {"$oid": "53544306eebc5c0ecac6cfba"}, 
   "expires_on": {"$date": 1399831110168}
}

我和mongod一起尝试了这个命令:

db.bar.find({point: {$near: [-84.26060492426588, 30.45023887165371]}});

但我得到了这个错误:

错误:{“$err”:“无法执行查询:处理查询时出错:ns=foo.bar skip=0\n注意:GEONEAR field=point maxdist=1.79769e 308 isNearSphere=0 | |第一:notFirst:full path:point\nSort:{}\n项目:{}\n规划器返回错误:无法找到$GEONEAR查询的索引”,“代码”:17007}

也许我的google fu今天不太清晰,但我什么也找不到。此外,我运行了确保索引命令。我的意图是这些是地图位置。

db.bar.ensureIndex({a:1});
db.bar.ensureIndex({geo:"2d"});

共有3个答案

瞿博易
2023-03-14

所以这里似乎有两件事不对:

  • 根据您显示的数据和查询信息,相关信息包含在字段点下,并采用GeoJSON格式。您的索引创建:
db.foo.createIndex({geo: "2d"})

不会“失败”,因为目前没有名为“geo”的字段,并且包含数据的字段应该位于该位置。如果您使用了“point”,这是正确的字段,那么您将收到一个错误,告诉您这种类型的索引对于GeoJSON数据无效。您需要一个“2dsphere”索引:

db.points.createIndex({ "point": "2dsphere" })
  • 扩展同样的问题,同样数据是GeoJSON格式,查询的形式是遗留坐标对的形式。您需要更改查询参数以便不再失败:
db.points.find({point: {
    $near: {
        $geometry:{ 
            type: "Point", 
            coordinates: [-84.26060492426588, 30.45023887165371]
        }
    }
}})

请参阅附近的文档

屈宏爽
2023-03-14
db.prod.createIndex({ "location": "2d" })

这为我解决了同样的问题。

其中prod是我的集合名称,位置是存储地理位置(GeoPoint)的列的名称

关于同样的一些讨论可以在这里找到

锺离飞尘
2023-03-14

没什么问题,您在foo数据库的foo集合上创建了索引,但正在查询bar集合。你需要正确的收藏。

阅读插入的文档时,需要添加“2dsphere”索引以支持geoJson对象。该索引需要位于文档的“点”元素上,因此请尝试

db.bar.createIndex({point:"2dsphere"});

然后,您可以通过为查询提供GeoJson obj进行如下查询:

db.bar.find(
   { point :
       { $near :
          {
            $geometry : {
               type : "Point" ,
               coordinates : [-84.27326978424058, 30.443902444762696] },
            $maxDistance : 1
          }
       }
    }
)
 类似资料:
  • 主要内容:什么是覆盖索引查询?,使用覆盖索引查询你可能听说过列索引是通过最大限度地减少查询所需的磁盘访问次数来优化查询性能的好方法。MongoDB 有一个字段索引的特定应用程序,称为覆盖索引查询(Covered Queries),其中查询的所有列都被进行索引。因为 MongoDB 不必检查除索引之外的任何文档,所以覆盖索引查询非常快。本节我们就来学习一下如何使用覆盖索引查询更快地查询数据。 什么是覆盖索引查询? 根据 MongoDB 官方文档,

  • 本文向大家介绍MongoDB的查询方法,包括了MongoDB的查询方法的使用技巧和注意事项,需要的朋友参考一下 代码: 以上面的测试数据为基础,进行下面的基本查询操作: 1、查询所有博客 2、查询所有博客的标题和内容(指定需要返回的键值) 注:1表示返回,0表示不返回。默认情况下,“_id”这个键总是被返回,即便是没有指定这个键 3、查询作者为“张三”的博客(=操作) 4、查询除了作者为“张三”的

  • 问题内容: 我在MongoDB上的Java查询中遇到了一些麻烦。 我在数据库中具有以下结构: 我想在数据库中查询字段’Sta​​tus.name’,例如SELECT * FROM table WHERE status.name =’Expired’ 我将如何在Java中为MongoDB进行这样的查询? 感谢您的帮助或建议! 问题答案: 这是一个例子:

  • 我正在通过猫鼬使用MongoDB。 > MongoDB是执行集合扫描还是索引有助于提高查询效率?查询是否与仅使用id字段有任何不同? 如果MongoDB在您查询非索引字段时进行集合扫描。如果集合扫描完全相同,查询多个非索引字段是否会加快查询速度?假设我查询五个非索引字段而不是两个(都返回相同的文档)。两个查询是否都进行相同的集合扫描?

  • 问题内容: 我如何将下面的切片查询写入golang? 尝试过但不起作用 找不到任何东西。有任何想法吗? 先感谢您 问题答案: 使用只能指定过滤器。但是,您有一个预测: 可以使用来指定投影,因此这就是您可以应用in投影的方式: 另请注意,确定您过滤的属性是还是只是一个错字,应该是。如果是后者,您还可以使用按文档ID查询:

  • 我在使用Python弹性搜索访问数据时遇到了一个问题。我正在得到 尝试使用时出错 我的弹性搜索版本6.5。4,python版本3.7。2.