我只是想让一个简单的near
查询工作。
{"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字段=点maxdist=1.79769e+308 isNearSphere=0||第一个:不第一个:完整路径:点\n排序:{}\n计划:{}\n计划员返回错误:找不到$geoNear查询”,“code”的索引:17007 }
也许我的google fu今天不是那么敏锐,但我找不到任何东西。另外,我运行了确保索引命令。我的意图是,这些是Map位置。
db.bar.ensureIndex({a:1});
db.bar.ensureIndex({geo:"2d"});
6条答案
按热度按时间ilmyapht1#
有一些问题,你在foo数据库的foo集合上创建了索引,但是正在查询bar集合。你需要在正确的集合上。
阅读插入的文档时,需要向support the geoJson objects添加一个“2dsphere”索引。
然后,您可以通过为查询提供geoJson obj来进行如下查询:
smdnsysy2#
这对我来说解决了同样的问题。
其中prod是我的集合名称,location是存储地理位置的列的名称(GeoPoint)
关于这一点的一些讨论可以在here中找到
kcugc4gi3#
所以这里似乎有几件事是错误的:
不会“失败”,因为目前没有一个名为“geo”的字段,并且包含数据的字段应该在那个位置。如果您使用了“point”,这是正确的字段,那么您将收到一个错误,告诉您这种类型的索引对于GeoJSON数据无效。您需要一个“2dsphere”索引:
请参阅
$near
的文档yyyllmsg4#
除了上面的答案,如果您已经尝试创建一个索引,并得到了一些语法或字段错误,您可以运行
db.<yourcollection>.dropIndexes();
清理所有索引并正确地重新创建它们。此外,索引应该在“coordinates”的父节点上创建,而不是在坐标本身上创建:
db.<yourcollection>.createIndex({ location: '2dsphere' });
注意,有“2d”和“2dsphere”,使用第二个,因为它是新事物。
5vf7fwbs5#
如果你使用mongoose连接,这将是正确的答案:
注意collection本身之前有一个“collections”属性。如果它不起作用,请检查console.log中的db object:
ahy6op9u6#
如果有人从spring-boot-starter-data-mongodb 2迁移到3
They desactivated the autoconfiguration of indexes by default,这可能导致此错误
'unable to find index for $geoNear query'