0

我在集合的数组字段上有一个多键索引。当我使用 $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))其中 Date(1564389554000) 是 ISODate("2019-07-29T08:39:14.000Z")

但我认为应该是

[ISODate("2014-07-29T08:39:14.000Z",ISODate("2019-07-29T08:39:14.000Z")]

请问有什么帮助吗?

4

0 回答 0