我有一份
形式的文件{
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();
这给了我不止一个字符串。一串重复的" a"长度1012的长度为1051的bson,有效载荷的长度将根据属性的名称而变化。无论属性的名称如何,索引失败时字符串的最大长度都是相同的。在这个简单的字符串中,可以索引的最大字符串是1012,但是UTF-16字符串的二进制长度与它的人类可读长度不完全成正比。
在将索引值发送到Mongo之前,是否有更好的方法来预测索引值的长度?
答案 0 :(得分:1)
BSON文档以长度字段为前缀以帮助扫描。因此,由于长度前缀和显式数组索引,BSON将使用比JSON更多的空间。
例如:
诸如{“hello”:“world”}之类的文档将存储为:
BSON:
\x16\x00\x00\x00
-----------------------> //文档总大小
\x02
------------------------------------------> / / 0x02 =类型字符串
hello\x00
----------------------------------> //字段名称
\x06\x00\x00\x00world\x00
---------> //字段值(值的大小,值,空终止符)
\x00
------------------------------------------> / / 0x00 =键入EOO('对象结束')
规格网址
BSONSPEC