near返回集合中的所有文档

时间:2016-04-30 07:07:15

标签: php mongodb

我有一个下面的代码应该返回那些lat,很长的mongodb,它们接近我提到的那些。但问题是它返回所有lat,long。

$collection->ensureIndex(array("location" => "2d"));
$a=array(24.8934,67.0281);
//print_r($a);

$distance='500';

$query = array('location' => array('$near' => array(24.8934,67.0281)));


$cursor = $collection->find($query);
try{
if ($cursor) {
   echo $arr= json_encode(iterator_to_array($cursor));
 // $j= json_decode($arr,false);
echo var_dump(json_decode($arr));
$j = json_decode($arr,false);
 $lat= $j->{'57237036d89c45e1e3fda94e'}->location[0]; 
 $lng= $j->{'57237036d89c45e1e3fda94e'}->location[1]; 
} else {
    echo "{ 'status' : 'false' }";
}

返回以下内容:

object(stdClass)[7]
  public '572453d55addfab49090ea71' => 
    object(stdClass)[6]
      public '_id' => 
        object(stdClass)[8]
          public '$id' => string '572453d55addfab49090ea71' (length=24)
      public 'location' => 
        array (size=2)
          0 => float 24.8615
          1 => float 67.0099
  public '57237036d89c45e1e3fda94e' => 
    object(stdClass)[9]
      public '_id' => 
        object(stdClass)[10]
          public '$id' => string '57237036d89c45e1e3fda94e' (length=24)
      public 'location' => 
        array (size=2)
          0 => float 33.7715
          1 => float 72.7511

相反,它应该只返回第一个文档。

1 个答案:

答案 0 :(得分:1)

示例代码无法正常工作的原因是$ distance变量已定义,但未传递给查询。

您需要修改代码,使其类似于以下示例:

$distance=500;
$cursor = $collection->find(['location' =>
['$near'=> [ 24.8934,67.0281 ],
'$maxDistance' => $distance]]);

对于大多数用例,我们建议您使用较新的2dsphere索引,该索引使用类似地球的几何体和GeoJSON对象。有关此功能的详细信息,请查看2dsphere index

如果使用2dsphere索引,代码将类似于:

$distance=500;
$cursor = $collection->find(['location' =>
['$near'=>
['$geometry'=>
[ 'type' => "Point",  'coordinates' => [ 24.8934,67.0281 ] ],
'$maxDistance' => $distance]]]);

您可能还会发现spherical geometry tutorial有帮助。