Compass 1.29.6导入JSON报Operation passed in cannot be an array
报错根因
这是Compass 1.29.6版本JSON导入模块的已知逻辑缺陷,和你的JSON格式合不合法没有关系:
- 该版本的导入预校验逻辑没有做层级判断,不会只检查待导入内容的最外层结构,而是会递归扫描所有字段值,只要在任意层级检测到数组类型的值,就会误判为传入了数组类型的非法操作参数,直接抛出
Operation passed in cannot be an array报错。 - 正常情况下Compass导入功能支持的JSON格式只有两类:一是顶级结构为数组,数组的每个元素对应一条要插入集合的文档;二是JSON Lines格式,文件中每一行是一个独立的文档对象,无外层包裹。两类格式都支持文档内部嵌套数组字段,只是1.29.6的校验逻辑写漏了层级判断,才会把
Children字段的数组误判为非法操作参数。
适配方案
按操作成本从低到高选即可:
- 手动指定导入格式:把你的JSON内容存为独立文件,导入时不要让Compass自动识别文件格式,手动在格式下拉框选择
JSON,会跳过有bug的递归校验步骤,原文件不需要做任何修改就能正常导入。 - 调整外层结构:如果手动选格式还是报错,把你要导入的单个文档外层包裹一层数组,改成如下格式再导入即可绕过校验:
[ { "Name": "root", "ID": 0, "Children": [ { "Name": "Chocolates", "ID": 1, "ParentID": 0 } ] } ]
- 版本升级:直接将Compass升级到1.30及以上的稳定版本,这个层级校验的bug在1.30版本迭代时已经被官方修复,包含嵌套数组的单文档不需要做任何格式调整就能正常导入。
内容的提问来源于stack exchange,提问作者PandaWood
相关产品推荐
相关产品推荐

