【问题标题】:$and with $nearSphere in mongodb$and 与 $nearSphere 在 mongodb
【发布时间】:2014-07-19 18:22:03
【问题描述】:

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

设置如下:

集合: db.t2.find():

{ 
    "_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.getIndices():

{
    "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 的单个查询在当前设置下效果很好。但是,当我在带有 $and 子句的单个查询中一起使用 tofrom 时:

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 (needs index), 2dsphere (needs index), for: { $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 操作生效?

【问题讨论】:

    标签: mongodb indexing geospatial


    【解决方案1】:

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

    但是你在这里的特殊问题是你不能这样做。

    可以在GitHub 上进行测试的代码和 cmets,但本质上是:

        // 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】:

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

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

      Core ServerSERVER-4572 地理空间索引不能用于 $and 查询条件?

      应该从 2.6 开始修复 - 如果您运行的是 2.4 或更早版本,我会升级,如果您运行的是 2.6.X,我会将其报告为错误。

      【讨论】:

      • 我希望它在 MongoDB 2.6 中不起作用,也不在上面。这些结果无法合并是有原因的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多