Yii Emongodocuments 在忽略 maxDistance 的查询附近

Posted

技术标签:

【中文标题】Yii Emongodocuments 在忽略 maxDistance 的查询附近【英文标题】:Yii Emongodocuments near queries ignoring maxDistance 【发布时间】:2012-11-12 18:36:19 【问题描述】:

我正在尝试使用 $near 来查找我的用户附近的地点。

    $places = Places::model ()->findAll(array (
            "conditions" => array (
                'location' => Array('near' => array((float)$this->latitudeUser,(float)$this->longitudeUser)),
            ),
            "maxDistance" => 1,
            "limit" => 5,
        ));

除了它可以找到远至美国德克萨斯州和我在加拿大蒙特利尔的地方之外,一切似乎都有效。我不知道我能做些什么来使 maxDistance 工作。看来我不能使用 GeoNear 或 nearSphere,因为 EMongoDocuments 似乎不支持它们。

那么我是否遗漏了一些明显的东西?

我知道mongomapper-near-with-maxdistance-mongooperationfailure-geo-values-have-to,但没有任何帮助。

编辑:更改经度纬度的顺序

【问题讨论】:

【参考方案1】:

MongoDB 需要以下格式的坐标:纬度,经度。你的数组有错误的方法。距离应该以度为单位,除非您使用 nearSphere。 nearSphere 的结果应该与 near 相似,因此 EMongoDocuments 应该支持。如果您使用 nearSphere,最大距离以 弧度 为单位,因此如果您使用该距离(以 km 为单位)除以地球的半径(以 km 为单位,~6371)。

【讨论】:

EMongoDocuments 不(至少开箱即用)不支持 nearSphere。我更改了代码,但仍然没有使用 maxDistance。我在中国有一个地方,它会出现在结果中。甚至尝试将 0.00001 作为最大距离。【参考方案2】:

引用 mongolabs 的神奇家伙的话: 我相信您需要将 maxDistance 放在 $near 条件中。像这样的:

$places = Places::model ()->findAll(array (
"conditions" => array (
'location' => Array('near' => array((float)$this->latitudeUser,(float)$this->longitudeUser), 'maxDistance' => 1),
),
"limit" => 5,
));

我不熟悉这个框架,所以我不完全确定这是否正确,但我是基于等效 MongoDB 查询的正确语法:

db.places.find(  location :  $near : [50,50] , $maxDistance : 5   ).limit(5)

注意 $maxDistance 与 $near 处于相同的条件内。试一试,让我们知道它是否有帮助。 谢谢,

【讨论】:

【参考方案3】:

YiiMongoDbSuite 中的 EMongoCriteria 改变了 mongo 操作符的 char 大小写,maxDistance 将变为 "$maxdistance",然后 mongodb 服务器将忽略它并返回用户位置附近的所有 100 个项目。使用MongoYii不会改变你的查询条件:http://sammaye.github.io/MongoYii/

【讨论】:

以上是关于Yii Emongodocuments 在忽略 maxDistance 的查询附近的主要内容,如果未能解决你的问题,请参考以下文章

php Yii2批量插入助手。支持“忽略”和“重复密钥更新”策略

Yii2 带有游标的 Oracle 过程

Yii 2 —— 字段校验

Yii 模型中attributeLabels()函数的作用

yii 和 zend studio 集成

yii2框架目录