【发布时间】:2012-12-10 05:50:03
【问题描述】:
根据我从哪里询问,我得到的结果不同。我有一个由二维坐标索引的 Mongo 集合“停止”。
从 Mongo 控制台:
> db.stops.find({loc:{$near: [-##.94248402000001,##.444653126]}}).limit(3)
{ "_id" : ObjectId("4e8e0e64597535e4cb0001bd"), "stop_id" : 873198944, "stop_name" : "STOP ONE", "loc" : [ -##.942535, ##.444538 ] }
{ "_id" : ObjectId("4e8e0e66597535e4cb001260"), "stop_id" : 1603800857, "stop_name" : "STOP TWO", "loc" : [ -##.94355, ##.444672 ] }
{ "_id" : ObjectId("4e8e0e66597535e4cb000bb7"), "stop_id" : 3659710794, "stop_name" : "STOP THREE", "loc" : [ -##.94355, ##.444672 ] }
我的 PHP 代码:
$mdb=new Mongo();
$result=$mdb->myapp->stops->find(array('loc'=>array('$near'=>array(floatval($this->userLongitude),floatval($this->userLatitude)))))->limit(3);
我是 Mongo 的新手,但我很确定代码是正确的。它返回值...只是错误的值。这是var_dump(iterator_to_array($result)); 输出的内容:
array
'4e8e0e67597535e4cb002092' =>
array
'stop_id' => float 373055431
'stop_name' => string 'STOP A' (length=34)
'loc' =>
array
0 => float -##.937874
1 => float ##.442722
'4e8e0e64597535e4cb00022d' =>
array
'stop_id' => float 4245689695
'stop_name' => string 'STOP B' (length=32)
'loc' =>
array
0 => float -##.937515
1 => float ##.442692
'4e8e0e67597535e4cb0020af' =>
array
'stop_id' => float 134217173
'stop_name' => string 'STOP C' (length=21)
'loc' =>
array
0 => float -##.938965
1 => float ##.443787
一切都采用 [longitude,latitude] 格式,就像 Mongo 文档所说的那样。我不知道是什么导致了不同的结果,除了我可能搞砸了 PHP 查询,但它正在返回数据。怎么了?
为了简洁起见,我删除了 ID,并更改了一些除了隐私之外无关紧要的数据(即,## 隐藏度数和停止名称不同 - 如果关键看那些,我可以编辑它,但其他一切都保持不变。)
编辑:已解决 我过滤/解析经度和纬度的代码也将坐标截断到小数点后两位。当我直接使用控制台时,没有任何截断。
【问题讨论】:
-
只是一个疯狂的猜测,但这可能是因为你有 64 位版本的 MongoDB 和 32 位版本的 php?我可能错了,因为您使用所有浮点数而不是整数,但仍然值得怀疑。
-
array('loc'=>array('$near'=>array(floatval($this->userLongitude),floatval($this->userLatitude))))的 var_dump 返回什么? -
@Mechcozmo 你应该在下面添加你的答案:)