我不确定您为什么要索引如此大的字段,但是文档中指出,单个字段的索引长度不能超过1024个字节。如果您正在索引一个2.5MB的字段,它实际上没有被索引,而是被跳过了。
如果您需要索引真正大的字段数据,您需要想出一种在1024个字节以下的方式来表示它。例如,您可以计算CRC32并对其进行索引。虽然它可能不完美,但也可能足够好。
为了展示索引的奇特之处,我编写了一个简单的演示:
1. 新建数据库(test)
2. 在"value"字段上创建索引
3. 显示统计信息
4. 创建1000个文档,每个文档都有一个唯一的字段值,该值长度为102500个字符,并且每个文档都是唯一的
5. 显示统计信息。
示例:
> db.test.drop()
true
> db.test.ensureIndex({value:1})
> db.test.stats()
{
"ns" : "test.test",
"count" : 0,
"size" : 0,
"storageSize" : 8192,
"numExtents" : 1,
"nindexes" : 2,
"lastExtentSize" : 8192,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 16352,
"indexSizes" : {
"_id_" : 8176,
"value_1" : 8176
},
"ok" : 1
}
> var data="";for(var i=0;i<102500;i++){ data+= "z";};for(var i=0;i<1000;i++){ db.test.insert({value: data + i.toString() })};
> db.test.stats()
{
"ns" : "test.test",
"count" : 1000,
"size" : 106480000,
"avgObjSize" : 106480,
"storageSize" : 123248640,
"numExtents" : 8,
"nindexes" : 2,
"lastExtentSize" : 37625856,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 49056,
"indexSizes" : {
"_id_" : 40880,
"value_1" : 8176
},
"ok" : 1
}
你会发现存储大小(
storageSize
)已经急剧增加,但
totalIndexSize
仍然很小。主要是因为它涵盖了
_id
。
你也可以使用这种技术(
http://docs.mongodb.org/manual/faq/storage/#how-can-i-check-the-size-of-indexes)查看特定索引的详细信息。
你可以看到
value
索引很小(大小)。
> db.test.$value_1.stats()
{
"ns" : "test.test.$value_1",
"count" : 1,
"size" : 8176,
"avgObjSize" : 8176,
"storageSize" : 36864,
"numExtents" : 1,
"nindexes" : 0,
"lastExtentSize" : 36864,
"paddingFactor" : 1,
"systemFlags" : 0,
"userFlags" : 0,
"totalIndexSize" : 0,
"indexSizes" : {
},
"ok" : 1
}
{ _id : 1, favoriteFood : "cheese" }
,并且我在favoriteFood
上建立了索引,那么我的索引大小会是多少? - Kevin Meredith