【问题标题】:Distance returns null for Mongodb 2.6对于 Mongodb 2.6,距离返回 null
【发布时间】:2014-05-23 08:55:12
【问题描述】:

我刚刚将 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 都可以!

【问题讨论】:

  • 它会返回以前版本的内容吗?另外为什么不尝试真正的 mongoshell?
  • 我正在使用 mongodb Doctrine ODM,它适用于 geoNear,但不适用于 near..
  • 啊!格式最近发生了变化。见docs.mongodb.org/manual/reference/glossary/…

标签: mongodb


【解决方案1】:

在 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 }

【讨论】:

  • 你能把它翻译成 Doctrine 吗?
  • 我认为 Doctrine 尚未完全更新以支持所有新的驱动程序和 MongoDB 功能。我在 Doctrine 中找不到任何对 geoNearDistance 的引用:(
  • @Sekai:$meta 项目运算符不能与 Doctrine 的查询构建器一起使用,这取决于 select() 的实现方式。我在doctrine/mongodb #170 中打开了一个问题来跟踪此功能。也就是说,您可以将此语法与基本的find() 方法一起使用(不使用查询生成器),因为项目字段数组按原样传递给驱动程序。
【解决方案2】:

我假设您的模型具有使用@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()

【讨论】:

  • 您好! :D 你是对的,我的距离字段注释为@distance。但话又说回来,如果它只适用于 geoNear ,这是否意味着我不能使用 $mindistance ?因为它只适用于 $near..
  • $near$nearSphere 运算符支持$minDistancegeoNear 命令支持minDistance 选项。有关示例,请参阅 (this commit) 中与 SERVER-9395 关联的单元测试,因为 MongoDB 文档中尚未涵盖此内容。您可能还想阅读实现minDistance 的工程师的this blog post
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 2019-11-27
  • 2019-09-22
  • 2015-11-18
  • 2019-10-14
  • 2021-01-18
相关资源
最近更新 更多