在 $or 中运行多个 geo $near 查询

Posted

技术标签:

【中文标题】在 $or 中运行多个 geo $near 查询【英文标题】:Running multiple geo $near queries inside an $or 【发布时间】: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 【参考方案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)。执行两次查询获取数据

【讨论】:

以上是关于在 $or 中运行多个 geo $near 查询的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose Geo Near Search - ???????????

nodejs + mongodb实现模糊查询与全文搜索

如何针对具有多个合同的本地网络运行 Near-js-api 测试

elk笔记13--Queries-geo queries

Mongoosejs:将 query.or() 与地理空间查询一起使用

在 AND 内具有多个 OR 条件的 SQL 查询返回 null 或空