Mongodb多键索引无法正常工作

时间:2019-04-15 09:49:12

标签: arrays mongodb indexing multikey

我在集合的数组字段上有一个多键索引。当我使用$ 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")]

请帮忙吗?

0 个答案:

没有答案