【问题标题】:MongoDB search all document with lat and lng in polygonMongoDB 在多边形中搜索所有带有 lat 和 lng 的文档
【发布时间】:2014-03-12 16:08:05
【问题描述】:

我正在阅读 tutorial 以了解如何获取在 google maps 多边形抽屉给出的多边形内具有位置的文档。

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

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.....

可能是什么错误?

谢谢!

【问题讨论】:

    标签: mongodb google-maps mongodb-query polygon


    【解决方案1】:

    在寻找进一步的教程之前,我认为你已经在这个案例中完成了因为你想要用 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 存储中的首选形式是 array 形式,以便始终如一地维护可能无法维持所需顺序的跨语言顺序 散列

    pos : [ <longitude> , <latitude> ]
    

    不能为“经度”和“纬度”值设置两个单独的字段,因为 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
                ]
            }
        }
    }
    

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

    【讨论】:

    • 非常感谢您的回复!我将我的字段转换为匹配 mongoDB 索引,并且一切正常。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2020-01-20
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 2016-11-09
    相关资源
    最近更新 更多