预测MongoDb中字符串的索引键长度

时间:2016-09-06 17:40:02

标签: c# mongodb mongodb-.net-driver bson

我有一份

形式的文件
{
    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之前,是否有更好的方法来预测索引值的长度?

1 个答案:

答案 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