【问题标题】:Running multiple geo $near queries inside an $or在 $or 中运行多个 geo $near 查询
【发布时间】:2014-07-04 12:34:30
【问题描述】:

在查询 mongodb 数据库时,是否可以在 $or 语句中执行多个地理查询,例如 $near 或 $geoNear?

我总是收到错误“异常:$ 或可能不包含‘特殊’查询”

经过一番谷歌搜索后,我发现问题https://jira.mongodb.org/browse/SERVER-3984 已关闭并标记为“已修复”。

对我来说,运行多个地理查询时似乎仍然存在错误。 这是我的测试代码:

db.entry.find({
    $or: [
        {
            "address.geo": {
                $near: { 
                    $geometry : {
                       type : "Point" ,
                       coordinates : [ 9.7043 , 52.3019 ] },
                    $maxDistance : 50000 
                }
            }
        },
        {
            "address.geo": {
                $near: { 
                    $geometry : {
                       type : "Point" ,
                       coordinates : [ 9.6043 , 52.1019 ] },
                    $maxDistance : 50000 
                }
            }
        }
    ]
}).count();

这就是结果:

uncaught exception: count failed: {
    "errmsg" : "exception: $or may not contain 'special' query",
    "code" : 13291,
    "ok" : 0
}

【问题讨论】:

  • 你用的是什么版本的mongodb?
  • 由于我们仍处于评估阶段,我们处于最新版本 - 2.6.3

标签: mongodb


【解决方案1】:

您不能在 $or 子句中使用 $near(或 $nearSphere):

$or 和地理空间查询

在 2.6 版中更改。

$or 支持地理空间子句,但以下例外: near 子句(near 子句包括 $nearSphere 和 $near)。 $或不能 包含与任何其他子句的近子句。

但是,您可以在 $or 中使用其他地理空间子句,因此如果您可以重构查询以使用不同的地理空间运算符,您将能够使用 $or。

【讨论】:

  • 好的。但是哪一个?!我必须从中心位置查询给定半径内的条目。我唯一能弄清楚的是“$ geoWithin”。我遇到了同样的错误... :(
  • 好的。我让它与 $geoWithin 和 $center 一起工作。不幸的是,对于 $circle,我可以提供一个名为“radius”的参数。这个半径单位不是米或公里,而是坐标系统中的单位。所以值为“1”的半径给了我比预期更大的半径。但这现在应该很容易了,因为我们没有为我们的地理信息使用球体。谢谢;)
  • 没问题。测量单位是弧度,所以如果你想从英里或公里转换,你可以按照这里的指示:docs.mongodb.org/manual/tutorial/…
  • @JohnPetrone 我想将我的位置与 startLocation、endLocation 和航点列表进行比较。我如何做到这一点?
【解决方案2】:

您不能在$or 子句和$and 子句中使用$near(或$nearSphere)。执行两次查询获取数据

【讨论】:

    猜你喜欢
    • 2019-10-12
    • 2020-09-22
    • 2011-06-12
    • 2023-03-15
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    相关资源
    最近更新 更多