Open usbuild opened 7 years ago
如果要用字典,key 就不可以是 number ,只能是 string 。如果是 Array 这要求必须 key 为连续的 integer 。所以这个测试案例本身是错误的用法,这里的 t 本身不是一个可以合法 encode 成 bson 对象的 table 。
参见 http://bsonspec.org/spec.html 中 element 和 array 的定义。
@cloudwu 谢谢回复,我一开始期望的结果是会以 dict 的形式写入 mongodb( integer 的 key 会被转成 string)而不是报错,其他绝大部分情况下数字和字符串混合 key 的情况下是可以 encode 的(当然这也是不规范的使用方法……)
@usbuild 可以考虑我这个修改,让 MongoDB 支持 integer 的 key 。如果数组用的比较少的情况下,对原有代码改动还是比较少的。
- 整数 key 将加前缀
_i_
保存到数据库- 加载数据库数据遇到 key 的字段前缀为
_i_
时,删除前缀然后转为整数 key- 需要打包数组的 table 时,需要特殊处理
https://github.com/hanxi/skynet-demo/blob/master/lualib-src/lua-bson.c
相关代码
lua_rawlen
可能返回在 hashpart 部分的 integer key,从而使得后面的lua_next
的结果处于不确定的状态。系统环境
Lua 5.3.2 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2
测试用例
输出