Laravel中Moloquent执行$geoNear提示无法找到索引的解决方法
解决Laravel Moloquent中$geoNear查询的索引错误问题
问题场景
你在Laravel 5.6中使用Moloquent模型操作MongoDB,集合中的数据结构如下:
{ "_id" : ObjectId("5afe619dbe0b8d0e5876b16b"), "name" : "Central Park", "categories" : [ "4d4b7105d754a06376d81259", "4bf58dd8d48988d116941735", "4bf58dd8d48988d119941735", "4d4b7105d754a06376d81259", "4bf58dd8d48988d116941735", "4bf58dd8d48988d119941735", "4d4b7105d754a06374d81259", "4bf58dd8d48988d16d941735" ], "loc" : { "type" : "Point", "coordinates" : [ 88.4166612820784, 22.5835157504658 ] } }
执行以下查询代码时:
$users = MongoTest::where('loc', 'near', [ '$geometry' => [ 'type' => 'Point', 'coordinates' => [ $longitude, $latitude ], ], '$maxDistance' => 10, ])->get(); print_r($users);
遇到了这个错误:
error processing query: ns=tkit.testTree: GEONEAR field=loc maxdist=10 isNearSphere=0 Sort: {} Proj: {} planner returned error: unable to find index for $geoNear query
错误原因
MongoDB的地理空间查询(比如$near)必须依赖地理空间索引才能正常执行,你的集合testTree还没有为loc字段创建对应的索引,所以数据库无法找到合适的索引来处理这个查询请求。
解决方法
你可以通过两种方式创建所需的索引:
方法一:直接在MongoDB Shell中手动创建
打开MongoDB Shell,连接到你的数据库,然后执行以下命令(注意替换testTree为你的实际集合名):
db.testTree.createIndex({ loc: "2dsphere" })
2dsphere索引专门用于处理GeoJSON格式的地理数据(你的loc字段是Point类型,正好匹配)。
方法二:在Moloquent模型中定义索引,让Laravel自动管理
在你的MongoTest模型中添加$indexes属性,指定要创建的地理空间索引:
class MongoTest extends Moloquent { // 确保集合名和你的实际集合一致 protected $collection = 'testTree'; // 定义索引 protected $indexes = [ [ 'keys' => ['loc' => '2dsphere'], ], ]; }
添加完成后,你可以通过以下方式触发索引创建:
- 运行模型相关的操作时,Moloquent会自动检查并创建索引(部分版本需要手动触发)
- 或者在控制器/迁移文件中手动执行创建命令:
MongoTest::raw()->createIndex(['loc' => '2dsphere']);
创建完索引后,再重新执行你的查询代码,应该就能正常获取到附近的记录了。
内容的提问来源于stack exchange,提问作者Saswat
相关产品推荐
相关产品推荐

