Индексы MongoDB для динамических подполей

МонгоДБ 3.0.2. Примеры документов:

{ "_id" : NumberLong(1), Categories : { "123" : { "Shows" : NumberLong(7), "Clicks" : NumberLong(0) }, "221" : { "Shows" : NumberLong(33), "Clicks" : NumberLong(12) } } }
{ "_id" : NumberLong(2), Categories : { "221" : { "Shows" : NumberLong(33), "Clicks" : NumberLong(12) } } }
{ "_id" : NumberLong(3), Categories : { "123" : { "Shows" : NumberLong(8), "Clicks" : NumberLong(1) } } }
{ "_id" : NumberLong(4), Categories : { "99" : { "Shows" : NumberLong(144), "Clicks" : NumberLong(39) }, "221" : { "Shows" : NumberLong(52), "Clicks" : NumberLong(2) } } }
{ "_id" : NumberLong(5), Categories : { "95" : { "Shows" : NumberLong(18), "Clicks" : NumberLong(3) } } }
{ "_id" : NumberLong(6), Categories : { "123" : { "Shows" : NumberLong(89), "Clicks" : NumberLong(69) } } }

В моем случае в этом примере строковые значения, такие как «123», «221», «99», «95», являются идентификаторами некоторых категорий. Мне нужна сортировка только по Шоу с использованием идентификатора категории:

db.myCollection.find().sort( Categories."1".Shows : -1 )
db.myCollection.find().sort( Categories."95".Shows : 1 )
db.myCollection.find().sort( Categories."123".Shows : 1 )
db.myCollection.find().sort( Categories."221".Shows : -1 )

Но количество этих категорий составляет около 250+. Я не могу установить индексы для каждого, например:

db.myCollection.createIndex( { Categories."[1..250]".Shows : 1 } );

потому что идентификатор кошки больше 64 (ограничение MongoDB), и эти категории могут быть добавлены и удалены только для некоторых записей, и этот процесс динамичен.

Без индексов я получаю:

Неперехваченное исключение «MongoCursorException» с сообщением «localhost: 27017: ошибка исполнителя: использование буферизованных данных на этапе сортировки переполнения в размере 33554646 байт превышает внутренний предел в 33554432 байта» в ..

Может ли кто-нибудь дать решение для этого случая?


person mature    schedule 19.09.2018    source источник


Ответы (1)


Я не думаю, что вы можете решить эту проблему, используя текущий дизайн документа.

Возможно, вы захотите смоделировать свои категории по-другому, например. используя массив для категорий следующим образом:

{
    "_id" : 1,
    "Categories": [
        {
            "CategoryId": "123",
            "Details": {
                "Shows": 7,
                "Clicks": 0
        }, {
            "CategoryId": "221",
            "Details": {
               "Shows": 33,
               "Clicks": 12
            }
        }
    ]
}

В этом случае вы можете легко добавить один индекс db.collection.createIndex({"Categories.Details.Shows": 1})

person dnickless    schedule 19.09.2018
comment
Но в этом случае я все еще не могу добавить индексы для полей Shows. Мне нужна сортировка по показам для каждой категории. Для вашего случая дизайна db.myCollection.find({Categories.CategoryId:123}).sort( Categories.Details.Shows: -1) — показывает не проиндексированные. - person mature; 20.09.2018
comment
@DoanldF Мне жаль, что это была моя ошибка. Я ошибся полем. Но да, с этим дизайном вы также можете поставить индекс на Shows. - person dnickless; 20.09.2018