【问题标题】:Predicting index key length for a string in MongoDb预测 MongoDb 中字符串的索引键长度
【发布时间】:2016-09-07 02:11:31
【问题描述】:

我有一份表格文件

{
    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,并且有效负载的长度会有所不同,具体取决于属性的名称。无论属性名称如何,索引失败时字符串的最大长度都是相同的。在这个简单的字符串中,可以索引的最大字符串是 1012,但是 UTF-16 字符串的二进制长度与其人类可读长度并不完全成正比。

在将索引值发送到 Mongo 之前,有没有更好的方法来预测索引值的长度?

【问题讨论】:

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


    【解决方案1】:

    BSON 文档以长度字段为前缀以帮助扫描。因此,由于长度前缀和显式数组索引,BSON 将使用比 JSON 更多的空间。

    例如:
    像 {"hello":"world"} 这样的文档将存储为:

    Bson:
    \x16\x00\x00\x00------------------------------------>//文档总大小
    \x02--------------------------------------------------------->/ / 0x02 = 字符串类型
    hello\x00---------------------------------->// 字段名
    \x06\x00\x00\x00world\x00--------->// 字段值(值的大小,值,空终止符)
    \x00------------------------------------------>/ / 0x00 = 类型 EOO('对象结束')


    规格网址 BSONSPEC

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-08
      • 2015-06-17
      • 1970-01-01
      • 2012-06-24
      • 2019-02-05
      • 2016-05-10
      • 2013-01-16
      相关资源
      最近更新 更多