我有一个具有from和to点位置的集合。现在,我希望找到在给定源和目的地附近同时具有、to和from位置的文档。
下面是设置:
集合: 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.getIndages():
{
"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"
}对to或from的单个查询在当前设置下工作良好,结果很好。但是,当我在一个带有to子句的查询中同时使用$and和from时:
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操作的效果?
发布于 2014-05-30 08:54:18
该错误似乎来自一个$near 2.4版本,其中确实存在一个不允许内部$and类型查询的错误,以及访问另一个字段的$and操作。
但你的问题是你不能这么做。
测试这一点的代码和注释可以在GitHub上进行竞争,但本质上是:
// 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“索引交集非常不同。
至少现在,您最好的方法是自己执行每个查询,并在代码中手动地“联合/交叉”您的结果,当然,您自己的标记是针对您的来源和目的地的结果。
发布于 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。
https://stackoverflow.com/questions/23947003
复制相似问题