我不确定你为什么要索引这么大的字段,但正如它在文档中所说,它不会索引超过 1024 字节的单个字段。如果您正在索引一个 2.5MB 的字段,它并没有真正索引它,它被跳过了。
如果您需要索引非常大的字段数据,您需要想出一种方法来以适合 1024 字节以下的方式来表示它。例如,您可能能够计算 CRC32 并将其编入索引。虽然它不太可能是完美的,但它可能“足够好”。
只是为了展示索引的一些奇怪之处,我整理了一个简单的演示。
- 新数据库(测试)
value
在字段上创建索引
- 显示统计数据
- 创建 1000 个文档,每个文档的唯一字段值长度为 102500 个字符且唯一
- 显示统计数据。
例子:
> 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
s。
您还可以使用此技术( 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
}