首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongodb中的$and与$nearSphere

mongodb中的$and与$nearSphere
EN

Stack Overflow用户
提问于 2014-05-30 04:23:52
回答 2查看 934关注 0票数 0

我有一个具有fromto点位置的集合。现在,我希望找到在给定源和目的地附近同时具有、tofrom位置的文档。

下面是设置:

集合: db.t2.find():

代码语言:javascript
复制
{ 
    "_id" : ObjectId("5..4"), 
    "uid" : "sdrr", 
    "valid_upto": 122334, 
    "loc" : { 
        "from" : { 
            "type" : "Point", 
            "coordinates" : [  77.206672,  28.543347 ] 
        },
        "to" : { 
            "type" : "Point",
            "coordinates" : [  77.1997687,  28.5567278 ] 
        }
    }
}

索引:db.t2.getIndages():

代码语言:javascript
复制
{
    "v" : 1,
    "name" : "_id_",
    "key" : {
        "_id" : 1
    },
    "ns" : "mydb.t2"
},
{
    "v" : 1,
    "name" : "uid_1_loc.from_2dsphere_loc.to_2dsphere_valid_upto_1",
    "key" : {
        "uid" : 1,
        "loc.from" : "2dsphere",
        "loc.to" : "2dsphere",
        "valid_upto" : 1
    },
    "ns" : "mydb.t2"
}

tofrom的单个查询在当前设置下工作良好,结果很好。但是,当我在一个带有to子句的查询中同时使用$andfrom时:

代码语言:javascript
复制
db.t2.find({
    "$and" : [  
        {   
            "loc.from" : { 
                "$nearSphere" : [ 77.5454589,28.4621213 ], 
                "$maxDistance" : 0.18 
            }
        },
        {
            "loc.to" : {    
                "$nearSphere" : [ 77.206672, 28.543347 ], 
                "$maxDistance" : 0.18 
            }
        }
    ]
})

它引发以下错误:

错误:{ "$err“:”找不到任何特殊的索引: 2d (需要索引),2dsphere (需要索引),用于:{ $and:[{ loc.from:{ $nearSphere: 77.5454589,28.4621213,$maxDistance: 0.18 },{ loc.to:{ $nearSphere: 77.206672,28.543347,$maxDistance: 0.18 }}] }", “代码”:13038 }

我想数据已经从getIndices()中很明显地被索引了,但是仍然找不到索引!那么,问题在哪里,我如何才能修复它以产生$and-ed操作的效果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-30 08:54:18

该错误似乎来自一个$near 2.4版本,其中确实存在一个不允许内部$and类型查询的错误,以及访问另一个字段的$and操作。

但你的问题是你不能这么做。

测试这一点的代码和注释可以在GitHub上进行竞争,但本质上是:

代码语言:javascript
复制
    // There can only be one NEAR.  If there is a NEAR, it must be either the root or the root
    // must be an AND and its child must be a NEAR.
    size_t numGeoNear = countNodes(root, MatchExpression::GEO_NEAR);
    if (numGeoNear > 1) {
        return Status(ErrorCodes::BadValue, "Too many geoNear expressions");
    }

因此,这是一个从MongoDB 2.6中发出的错误,您试图这样做。

简单地查看一下方法中的所有代码,就会发现"geo“查询并不是唯一的,其他”特殊“索引类型的"text”也包含在相同的规则中。

造成这种情况的部分原因是所需的$meta“评分”,如本例中的$maxDistance.。实际上,没有有效的方法来组合或区分哪些值将实际应用于这样的组合结果中。

从技术上讲,另一个问题是能够在这样的查询中“交叉”索引。所需的模糊匹配使得这与基本的"Btree“索引交集非常不同。

至少现在,您最好的方法是自己执行每个查询,并在代码中手动地“联合/交叉”您的结果,当然,您自己的标记是针对您的来源和目的地的结果。

票数 2
EN

Stack Overflow用户

发布于 2014-05-30 04:46:53

这是MongoDB版本2.4和以前的一个已知问题,在2.5.5版本中修复了这个问题:

https://jira.mongodb.org/browse/SERVER-4572

核心服务器SERVER-4572地理空间索引不能用于查询的$and标准?

应该在2.6的时候修正--如果你运行2.4或以前的版本,我会升级,如果你运行的是2.6.X,我会把它报告为一个bug。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23947003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档