我有很多以语言代码为对象的对象。由于Java和Mongodb本身都使用UTF-8,并且因为语言代码是ASCII,所以它们应该每个字符加1个字节加上\ 0终止符。所以语言代码“en”在BSON对象和索引中只需要3个字节。
这是对的吗?我想知道我是否通过将字段转换为字节数组来保存任何内容,如:
byte[] lcBytes = langCode.getBytes("ISO-8859-1");
在使用Java驱动程序将它们保存到Mongodb之前?
答案 0 :(得分:3)
根据bson spec,它没有什么区别:
string ::= int32 (byte*) "\x00"
binary ::= int32 subtype (byte*)
换句话说,字符串是零终止的(因此浪费了一个字节),而二进制文件需要一个单字节的子类型字段。
当然,完美匹配的字符集可能更高效,因为字节数组本身可能更小(例如,对于您经常需要的字符不需要三个字节,但只需要一个字节)。再说一次,我几乎不认为这是值得的麻烦,因为它使得无法使用正则表达式,map / reduce,js函数等。也许对于非常的弧度字符集,但8859-1并不是太特别。
作为旁注,请记住index size is limited to about 1k,因此你不能在索引中抛出很长的字符串(并且在性能方面不是一个好主意)。
如果您只需要通过相等查询,也许您可以选择哈希?如果您需要存储非常大的字符串(非索引),压缩算法可能是个好主意。