预测 MongoDb 中字符串的索引键长度
Predicting index key length for a string in MongoDb
我有一份表格
{
itemId: SomeInteger
.... A bunch of other stuff
IndexedArrayOfStrings: [string1, string2, etc]
}
IndexedArrayOfStrings 上有一个索引。我有一些字符串太长了,它们打破了索引中项目的最大大小 1024 字节。通常,我会通过将项目转换为 BSON 来测试它,并测试字符串的长度。但是,当我尝试将字符串转换为 BSON 时,出现以下错误:
byte[] payload = doc.IndexedArrayOfStrings[0].ToBson();
System.InvalidOperationException : A String value cannot be written to the root level of a BSON document.
我估计大小的最佳尝试是使用以下代码获取 bson:
byte[] payload = new {IndexedArrayOfStrings = doc.IndexedArrayOfStrings}.ToBson();
这给我的不仅仅是一个字符串。一个长度为 1012 的重复 "a" 的字符串有一个长度为 1051 的 bson,并且 payload 的长度会有所不同,具体取决于 属性 的名称。无论 属性 的名称如何,索引失败时字符串的最大长度都是相同的。在这个简单的字符串中,可以索引的最大字符串是 1012,但是 UTF-16 字符串的二进制长度与其人类可读长度并不精确成正比。
有没有更好的方法在将索引值发送到 Mongo 之前预测其长度?
BSON 文档以长度字段为前缀以帮助扫描。因此,由于长度前缀和显式数组索引,BSON 将使用比 JSON 更多的 space。
例如:
诸如 {"hello":"world"} 之类的文档将存储为:
贝森:
\x16\x00\x00\x00
------------------------>//文档总大小
\x02
---------------------------------------->// 0x02 = 字符串类型
hello\x00
------------------------------------>//字段名
\x06\x00\x00\x00world\x00
---------->//字段值(值的大小、值、空终止符)
\x00
---------------------------------------->// 0x00 = 类型 EOO ('end of object')
规格URL
BSONSPEC
我有一份表格
{
itemId: SomeInteger
.... A bunch of other stuff
IndexedArrayOfStrings: [string1, string2, etc]
}
IndexedArrayOfStrings 上有一个索引。我有一些字符串太长了,它们打破了索引中项目的最大大小 1024 字节。通常,我会通过将项目转换为 BSON 来测试它,并测试字符串的长度。但是,当我尝试将字符串转换为 BSON 时,出现以下错误:
byte[] payload = doc.IndexedArrayOfStrings[0].ToBson();
System.InvalidOperationException : A String value cannot be written to the root level of a BSON document.
我估计大小的最佳尝试是使用以下代码获取 bson:
byte[] payload = new {IndexedArrayOfStrings = doc.IndexedArrayOfStrings}.ToBson();
这给我的不仅仅是一个字符串。一个长度为 1012 的重复 "a" 的字符串有一个长度为 1051 的 bson,并且 payload 的长度会有所不同,具体取决于 属性 的名称。无论 属性 的名称如何,索引失败时字符串的最大长度都是相同的。在这个简单的字符串中,可以索引的最大字符串是 1012,但是 UTF-16 字符串的二进制长度与其人类可读长度并不精确成正比。
有没有更好的方法在将索引值发送到 Mongo 之前预测其长度?
BSON 文档以长度字段为前缀以帮助扫描。因此,由于长度前缀和显式数组索引,BSON 将使用比 JSON 更多的 space。
例如:
诸如 {"hello":"world"} 之类的文档将存储为:
贝森:
\x16\x00\x00\x00
------------------------>//文档总大小
\x02
---------------------------------------->// 0x02 = 字符串类型
hello\x00
------------------------------------>//字段名
\x06\x00\x00\x00world\x00
---------->//字段值(值的大小、值、空终止符)
\x00
---------------------------------------->// 0x00 = 类型 EOO ('end of object')
规格URL
BSONSPEC