ThinkPHP5 mongodb地理位置查询


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

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注