MongoDB Индексы для динамических подполей
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), и эти категории могут быть добавлены и удалены только к некоторым записям, и этот процесс динамический.
Без индексов я получаю:
Uncaught исключение "MongoCursorException" с сообщением "localhost:27017: ошибка исполнителя: переполнение буферизованного уровня данных на этапе сортировки 33554646 байт превышает внутренний лимит 33554432 байт" в..
Может кто-нибудь дать решение для этого случая?
2 ответа
Я не думаю, что вы можете решить это, используя ваш текущий дизайн документа.
Возможно, вы захотите смоделировать свои категории другим способом, например, используя массив для категорий, например так:
{
"_id" : 1,
"Categories": [
{
"CategoryId": "123",
"Details": {
"Shows": 7,
"Clicks": 0
}, {
"CategoryId": "221",
"Details": {
"Shows": 33,
"Clicks": 12
}
}
]
}
В этом случае вы можете легко добавить один индекс db.collection.createIndex({"Categories.Details.Shows": 1})
Используя слегка модифицированную версию схемы dnickless, как показано ниже: { "_id": 1, "Категории": [ { "CategoryId": "123", "Шоу": 7, "Клики": 0 }, { "CategoryId": "221", "Шоу": 33, "Кликов": 12 } ] } Затем вы можете создать индекс на шоу. db.collection.createIndex({"Categories.Shows": 1})