MongoDB 失败,因为密钥太大而无法编制索引
MongoDB Fails Because Key Too Large To Index
我一直在尝试保存一个 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
对象之前,抓取程序一直按预期运行,所以我相信错误可以缩小到那里。但是,我不清楚任何键 "too large" 在哪里被索引。如果我的猜测是正确的,为什么 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
}
]
您在 restrictions
上有一个索引,根据您的数据,该索引完全没用,而且会非常大,因为它是一个子文档。
您可能想从集合中删除该索引:
db.Section.dropIndex({restrictions: 1});
我一直在尝试保存一个 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
对象之前,抓取程序一直按预期运行,所以我相信错误可以缩小到那里。但是,我不清楚任何键 "too large" 在哪里被索引。如果我的猜测是正确的,为什么 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
}
]
您在 restrictions
上有一个索引,根据您的数据,该索引完全没用,而且会非常大,因为它是一个子文档。
您可能想从集合中删除该索引:
db.Section.dropIndex({restrictions: 1});