我无法使用索引优化不同的查询。不同于使用覆盖查询的索引
我收集这个样子的:
{
"_id" : ObjectId("592ed92296232608d00358bd"),
"measurement" : ObjectId("592ed92196232608d0034c23"),
"loc" : {
"coordinates" : [
2.65939299848366,
50.4380671935187
],
"type" : "Point"
},
"elements" : [
ObjectId("592ed92196232608d0034c24"),
ObjectId("592ed92196232608d0034c26"),
ObjectId("592ed92196232608d0034c28")
]
}
我试图执行像
db.mycol.distinct('elements', {
$and:[
measurement:{
$in:[
ObjectId("592ed92196232608d0034c23"),
ObjectId("592ed92196232608d0034c24")
]
},
{
loc:{
$geoWithin:{
$geometry:{
type:'Polygon',
coordinates:[[
[
2.0214843750000004,
50.25071752130677
],
[
2.0214843750000004,
50.65294336725709
],
[
3.0487060546875004,
50.65294336725709
],
[
3.0487060546875004,
50.25071752130677
],
[
2.0214843750000004,
50.25071752130677
]
]]
}
}
}
}
]
})
查询和我有这样的指标:
{
measurement: 1,
loc: '2dsphere',
elements: 1
}
查询计划( db.mycol.explain().distinct(...)
)显示了一个IXSCAN,但查询花费了很长时间。我添加了索引,希望能使用Mongo covered query。美国商务部指出,
- 所有查询的字段是一个指数的一部分,
- 和所有字段中返回的结果是在相同的指数。
所以我猜我需要包括elements
的索引。但根据查询执行时间,它没有使用它。
什么是为这样的查询索引集合的最佳方法是什么?
在集合上创建多个'2dsphere'索引通常不是一个好主意。它实际上完全不支持聚合'$ geoNear'和其他'$ near'查询等操作。你应该选择你最常用的组合并坚持。 –
要尝试让1个索引,并回来告诉你结果 –
编辑。我只留下了包含“元素”的2个索引(不知道在哪里放置它,在最后还是在开始时,这没有记录)。这导致COLSCAN这次是 –