Mongodb 2.6的距离返回null

时间:2014-04-09 21:53:20

标签: mongodb

我刚刚将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没关系!

2 个答案:

答案 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()才需要

$neargeoNear()(即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 }