ThinkPHP5 mongodb地理位置查询
MongoDB查询地理位置一般如下语句:
db.getCollection('placeCollection').find({ loc :{ $near: { $geometry:{ type:"Point", coordinates:[116.42624,39.905514] }, $maxDistance:200, $minDistance:10 } } })
这个需要传给php-mongodb一个5维数组,而tp5的Mongod引擎只支持3维数组的条件查询,如:
$where = array( 'name' => 'coco', 'age' => array('$gt' => 20) );
所以把上面的5维数组传给think-mongo,会报错:
in Builder.php line 202 at Error::appError(8, ‘Undefined offset: 1’
Builder.php parseWhereItem这个方法里面的这一行:
list($exp, $value) = $val; $val = array('near'=>array( 'geometry'=>array( 'type'=>'Point', 'coordinates'=>array('1','2') )));
相当于把类似于$val这个数组赋值给了list函数,所以报错。
tp5似乎没有考虑过这种情况,这个库在github上看用户也很少,我提交了一个Issue。
https://github.com/top-think/think-mongo/issues/90
最后只好用原生php-mongodb查询来解决:
$query = new \MongoDB\Driver\Query($where, ['projection'=>['_id'=>1,'coordinates'=>1]]); $rows = $connection->query('location',$query);