Многоключевой индекс Mongodb не работает должным образом - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть индекс мультиключа для поля массива для коллекции. Когда я запрашиваю коллекцию с помощью $ 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")]

Любая помощь, пожалуйста?

...