我刚刚将mongodb从2.4升级到2.6。 现在我运行查询
$hospitals=$qb->select('distance','title','date','photos','description')
->field('coordinates')
->near((float)$lat, (float)$lng)
->limit(9)
->getQuery()
->execute()
->toArray();
距离始终为空。
这是一个错误还是什么?
PS:$ lat& $ lng没关系!
答案 0 :(得分:1)
我认为您的模型的distance
字段标有@Distance
。这仅适用于geoNear命令。我已在PR #851更新了ODM的文档,因此更改应在一两天内反映在主网站上。
出于某种原因,文档声明这与near()
查询构建器方法一起使用,该方法使用MongoDB的$near
查询运算符。这是不正确的,因为$near
运算符不返回计算的距离。 Alvin提到使用$meta
投影运算符,但geoNearDistance
目前是服务器中未记录的功能(仅textScore
公开记录)。
根据您的原始示例代码,以下内容应该有效:
$hospitals = $qb->select('title', 'date', 'photos', 'description')
->geoNear( (float) $lat, (float) $lng )
->limit(9)
->getQuery()
->execute()
->toArray();
只有field()
才需要 $near
。 geoNear()
(即geoNear
命令)将使用地理空间索引中包含的任何位置字段。此外,您不需要投影distance
字段,因为它是在结果从MongoDB返回后由ODM注入的。此外,MongoDB中的文档实际上永远不会存储distance
字段。有关填充distance
字段所涉及的确切代码,请参阅Builder::execute()
。
答案 1 :(得分:0)
在shell中,您可以执行类似
的操作t = db.test
t.insert({_id: 0, loc: [0,0]})
t.insert({_id: 0, loc: [1,1]})
t.ensureIndex({loc: "2d"})
t.find({loc: {$near: [0,0]}}, {dist: {$meta: "geoNearDistance"}})
结果是
{ "_id" : 0, "loc" : [ 0, 0 ], "dist" : 0 }
{ "_id" : 1, "loc" : [ 1, 1 ], "dist" : 1.4142135623730951 }