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

标签 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();

这给我的不仅仅是一个字符串。长度为 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/

相关文章:

c# - 在 Image 中仅显示图像文件的特定部分

node.js - 使用 Node 在 Heroku 上设置 mongodb

json - mongoimport 失败与 "The _id field cannot be changed from"不一致

mysql - Mongodb 查询用于在字段之间搜索一个字母数字邮政编码

mongodb - 多个复合键

javascript - 如何在 C# 中调用 javascript 函数

c# - 从 MongoDB 查询嵌套对象

C# Mongodb FindOneAndReplace 或 ReplaceOne 不起作用

mongodb - 可以无密码使用 mongoDB 吗?

c# - MFC 对话框中使用的托管 C# 用户控件未处理的异常