我有一个表单的文档
{
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 更多的空间。
例如:
诸如 {"hello":"world"} 之类的文档将存储为:
布森:
\x16\x00\x00\x00
------------------------>//文档总大小
\x02
---------------------------------------- ->//0x02 = 字符串类型
hello\x00
-------------------------------->//字段名
\x06\x00\x00\x00world\x00
-------->//字段值(值的大小、值、空终止符)
\x00
---------------------------------------- ->//0x00 = 类型 EOO(“对象结束”)
指定网址
BSONSPEC
关于c# - 预测 MongoDb 中字符串的索引键长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39354892/