我有一个包含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.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"
}
to
或from
的单个查询与当前设置配合使用效果不错。但是,当我在to
子句的单个查询中一起使用from
和$and
时:
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(需要索引),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操作生效?
答案 0 :(得分:2)
MongoDB 2.4版本中似乎存在错误,其中确实存在一个错误,该错误不允许 $near
类型的查询和 $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"在这个和另一个"特殊的"索引类型"文本"包含在相同的规则中。
部分原因是 $meta
"得分"这是必需的,例如 $maxDistance
。实际上没有有效的方法来组合或辨别哪个值实际应用于这样的组合结果中。
在更多的技术说明中,另一个问题是能够“交叉”#34;查询中的索引,例如this。所需的模糊匹配使得这与基本的" Btree"指数交叉。
至少现在,您最好的方法是自己执行每个查询并手动执行#34; union / intersect"你的代码结果,当然你自己标记哪些结果是你的来源,哪些是你的目的地。
答案 1 :(得分:0)
这是版本2.4和MongoDB之前的已知问题,已在2.5.5版本中修复:
https://jira.mongodb.org/browse/SERVER-4572
Core ServerSERVER-4572地理空间索引不能在$和中使用 查询的标准?
应该在2.6之前修复 - 如果你运行2.4或之前我升级,如果你运行2.6.X我会报告它是一个错误。