MongoDB使用lat和lng多边形搜索所有文档

时间:2014-03-12 16:08:05

标签: mongodb google-maps mongodb-query polygon

我正在那个tutorial阅读,看看如何获​​取位于谷歌地图多边形抽屉给出的多边形内的文档。

在该教程中,它将位置存储在如下数组中:

pos:{lat:xxx,lng:yyy}

这不是我的情况,因为在我的文档中,值存储如下:

{...
"hotel_lat":"xxx",
"hotel_lng":"yyy",
...
},
{...
"hotel_lat":"xxx",
"hotel_lng":"yyy",
...
},
{...
"hotel_lat":"xxx",
"hotel_lng":"yyy",
...
},
...

因此,在本教程中,它使用该查询来查找多边形中的所有文档:

$query = array("pos" => array(
               '$within' => array('$polygon' => $poly)));
$cursor = $collection->find($query);

我改变它:

$query = array(
array("hotel_lat","hotel_lng") => array(
'$within' => array('$polygon' => $poly)))

但它给了我这个错误:Illegal offset type in.....

可能是什么错误?

谢谢!

1 个答案:

答案 0 :(得分:3)

在寻找进一步的教程之前,我在这个案例中已经完成了,因为你想要用PHP编写的东西,MongoDB站点有你需要的基本教程信息:

  

http://docs.mongodb.org/manual/tutorial/query-a-2d-index/

在你说之前,"这不是PHP"然后看下面的代码:

$result = '{"$pos": { "$within": { "$polygon": "$poly" } } }';
print_r( json_decode( $result ) );

输出

stdClass Object
(
    [$pos] => stdClass Object
        (
            [$within] => stdClass Object
                (
                    [$polygon] => $poly
                )

        )

)

这样可以让您了解如何在PHP中编写它。反之亦然,转换为JSON并查看您的编码形式是否正确。

所以你实际编写的代码,甚至不是PHP的有效结构,更不用说偏离所需的语法了。

core documentation中说明了您的存储必须的样子,以及MongoDB存储中的首选形式是数组形式,以便始终保持可能无法维持所需顺序的语言的顺序 的散列

pos : [ <longitude> , <latitude> ]

不能为&#34;经度&#34;提供两个单独的字段和&#34;纬度&#34;值,因为MongoDB 不能在多个字段上创建所需的地理空间索引。如果你已经设法接收你的数据,其中的值在谨慎的字段中,那么由你来重新塑造该数据以满足MongoDB的正确存储要求。

在继续学习其他教程任务之前,请先阅读所有MongoDB documentation修复您的数据,使其格式正确,索引必填字段。然后,您可以使用地理空间查询。

请在开发过程中定期使用json_encodejson_decode,因为这是一种非常明确的方式来比较文档示例和可视化您正在做的事情:

$poly = array();
array_push(
  $poly, floatval(51.52081391707402), floatval(-0.12737274169921875),
  floatval(51.487582985843034), floatval(-0.13578414916992188));

$test = array("pos" => array('$within' => array('$polygon' => $poly)));
echo json_encode( $test, JSON_PRETTY_PRINT ) ."\n"

导致:

{
    "pos": {
        "$within": {
            "$polygon": [
                51.520813917074,
                -0.12737274169922,
                51.487582985843,
                -0.13578414916992
            ]
        }
    }
}

作为JSON表示结构如何实际传输到转换为BSON的服务器。