我在集合的数组字段上有一个多键索引。当我使用$ elemMatch查询该字段的集合时,尽管有索引,但是查询非常慢。 所以我做了解释,索引范围似乎不正确。
我有mongoDB 3.2.11版
以下是收集文档的结构:
{
"_id" : ObjectId("5c3b2def2157ed8004f6df42"),
...
"optins" : [
{
"active" : true,
"campaign" : "campaign-partenaires",
"register_date" : ISODate("2014-07-29T08:39:14.000Z")
},
{
"active" : false,
"campaign" : "campaign-top-20",
"register_date" : ISODate("2014-07-29T08:39:14.000Z"),
"unregister_date" : ISODate("2018-03-01T09:37:58.000Z"),
},
...
]
}
索引定义:
createIndex(
{
'optins.campaign':1,
'optins.active':1,
'optins.register_date':1,
'optins.unregister_date':1
},
{
background:true,
sparse:false
}
)
查询:
db.getCollection('lead').find(
{
optins : {
$elemMatch : {
campaign: "campaign-partenaires",
active : true,
register_date : {
$gt: ISODate("2014-07-29T08:39:14.000Z"),
$lt: ISODate("2019-07-29T08:39:14.000Z")
}
}
}
})
解释获奖计划输入阶段:
{
"stage" : "IXSCAN",
"keyPattern" : {
"optins.campaign" : 1.0,
"optins.active" : 1.0,
"optins.register_date" : 1.0,
"optins.unregister_date" : 1.0
},
"indexName" : "optins.campaign_1_optins.active_1_optins.register_date_1_optins.unregister_date_1",
"isMultiKey" : true,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"optins.campaign" : [
"[\"campaign-partenaires\", \"campaign-partenaires\"]"
],
"optins.active" : [
"[true, true]"
],
"optins.register_date" : [
"(true, new Date(1564389554000))"
],
"optins.unregister_date" : [
"[MinKey, MaxKey]"
]
}
}
所以我不明白为什么unregister_date的边界是
(true, new Date(1564389554000))
,其中日期(1564389554000)是ISODate(“ 2019-07-29T08:39:14.000Z”)
但是我认为应该是
[ISODate("2014-07-29T08:39:14.000Z",ISODate("2019-07-29T08:39:14.000Z")]
请帮忙吗?