MongoDB не работает, потому что ключ слишком велик для индексации

Я пытаюсь сохранить документ MongoDB и получаю странную ошибку, связанную с тем, что ключ слишком велик для индексации. Я привел пример функционального документа ниже, а также тот, который создает ошибку:

Функционал:

{ uniquenumber: 'Valid Until Addition of Restrictions',
  name: 'Valid Until Addition of Restrictions'
  fieldofstudy: 'Valid Until Addition of Restrictions',
  section: 'Valid Until Addition of Restrictions',
  restrictions:
   { 'Must be assigned one of the following Student Attributes':
      [ 'Non-Res. In-State',
        'Non-Res. Out-of-State',
        'DE Student Non-Res Out-of-St',
        'Resident In-State',
        'Res. Out-of-State' ],
     'Must be enrolled in one of the following Levels': [ 'Graduate' ] },
  times: [],
  professors: [ 'Jo Blo' ] }

Нефункционально:

{
    "uniquenumber": "Valid Until Addition of Restrictions",
    "name": "Valid Until Addition of Restrictions",
    "fieldofstudy": "Valid Until Addition of Restrictions",
    "section": 'Valid Until Addition of Restrictions',
    "restrictions": {
        "May not be enrolled in one of the following Programs": ["MA [LA] Non-thesis option", "MS [AG] Non-thesis option", "MS [AR] Non-thesis option", "MS [BA] Non-thesis option", "MS [COFD] Non-thesis option", "MS [ED] Non-thesis option", "MS [EN] Non-thesis option", "MS [GE] Non-thesis option", "MS [LA] Non-thesis option", "MS [SC] Non-thesis option", "MS [VM] Non-thesis option", "MS NTO (Special Programs)", "MUP [AR] Non-thesis option"],
        "Must be enrolled in one of the following Levels": ["Graduate"],
        "May not be enrolled in one of the following Degrees": ["Master of Agribusiness", "Master of Agriculture", "Master of Architecture", "Master of Business Admin.", "Master of Computer Science", "Master of Education", "Master of Engineering", "Master of Land Econ & Real Est", "Master of Geoscience", "Master of Landscape Arch.", "Master of Public Administratn", "Master of Public Health", "Master of Public Svc & Admin"],
        "May not be enrolled in one of the following Colleges": ["English Language Institute"],
        "Must be assigned one of the following Student Attributes": ["Non-Res. In-State", "Non-Res. Out-of-State", "DE Student Non-Res Out-of-St", "Resident In-State", "Res. Out-of-State"],
        "Must be enrolled in one of the following Classifications": ["G7-Graduate, Master's Level", "G8-Graduate, Doctoral Level", "G9-Graduate, Mas/Doc Admitted"]
    },
    "times": [],
    "professors": []
}

Вплоть до создания объекта restrictions парсер работал как положено, поэтому я считаю, что ошибка может быть сужена до этого. Однако мне непонятно, где какой-либо ключ является «слишком большим» для индексации. Если моя догадка верна, почему Mongo считает это ключом и как я могу исправить ситуацию?

РЕДАКТИРОВАТЬ: ответ на db.Section.getIndexes(); показан ниже:

[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "database.Section"
        },
        {
                "v" : 2,
                "unique" : true,
                "key" : {
                        "uniquenumber" : 1
                },
                "name" : "uniquenumber_1",
                "ns" : "database.Section",
                "background" : true
        },
        {
                "v" : 2,
                "key" : {
                        "name" : 1
                },
                "name" : "name_1",
                "ns" : "database.Section",
                "background" : true
        },
        {
                "v" : 2,
                "key" : {
                        "fieldofstudy" : 1
                },
                "name" : "fieldofstudy_1",
                "ns" : "database.Section",
                "background" : true
        },
        {
                "v" : 2,
                "key" : {
                        "course" : 1
                },
                "name" : "course_1",
                "ns" : "database.Section",
                "background" : true
        },
        {
                "v" : 2,
                "key" : {
                        "section" : 1
                },
                "name" : "section_1",
                "ns" : "database.Section",
                "background" : true
        },
        {
                "v" : 2,
                "key" : {
                        "professors" : 1
                },
                "name" : "professors_1",
                "ns" : "database.Section",
                "background" : true
        },
        {
                "v" : 2,
                "key" : {
                        "times" : 1
                },
                "name" : "times_1",
                "ns" : "database.Section",
                "background" : true
        },
        {
                "v" : 2,
                "key" : {
                        "restrictions" : 1
                },
                "name" : "restrictions_1",
                "ns" : "database.Section",
                "background" : true
        }
]

person Quontas    schedule 04.06.2017    source источник
comment
Привет Квонтас; Можете ли вы показать нам, какие индексы у вас есть в этой коллекции?   -  person Vince Bowdren    schedule 05.06.2017
comment
Для справки: общий размер записи индекса должен быть меньше 1024 байт (docs.mongodb.com/manual/reference/limits/#Index-Key-Limit). Ошибка указывает на то, что в этой коллекции существует такой индекс, что значение в нефункциональном документе превышает этот предел. Мы не можем сказать, что вызывает сбой, не зная существующих индексов, но я предполагаю, что вы проиндексировали поле ограничений.   -  person Adam Harrison    schedule 05.06.2017
comment
Ответ на db.Section.getIndexes(); показан в исходном сообщении.   -  person Quontas    schedule 05.06.2017
comment
@AdamHarrison существующие индексы находятся в отредактированном сообщении.   -  person Quontas    schedule 05.06.2017
comment
@VinceBowdren индексы находятся в отредактированном посте.   -  person Quontas    schedule 05.06.2017
comment
У вас есть индекс restrictions, который, судя по вашим данным, совершенно бесполезен и будет очень большим. Вероятно, вы захотите удалить этот индекс из коллекции.   -  person JohnnyHK    schedule 05.06.2017
comment
Спасибо, @JohnnyHK! Тем не менее, я хотел бы, чтобы ограничения были сохранены вместе с документом, но, возможно, не доступны для поиска. Есть ли правильный способ сделать это?   -  person Quontas    schedule 05.06.2017
comment
Конечно, просто не создавайте индекс для этого поля.   -  person JohnnyHK    schedule 05.06.2017
comment
@JohnnyHK stackoverflow.com/questions/44359738/   -  person Quontas    schedule 05.06.2017


Ответы (1)


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

Вероятно, вы захотите удалить этот индекс из коллекции:

db.Section.dropIndex({restrictions: 1});
person JohnnyHK    schedule 05.06.2017