使用mongoimport导入JSON文件时重复键仅首个对象被导入的问题
问题根源:JSON规范不允许重复键名
兄弟,这可不是mongoimport的bug,本质是JSON规范本身就禁止对象中存在重复的键名。当解析工具碰到重复键时,不同实现会有不同的处理逻辑——在你的场景里,解析器直接保留了第一个"b"对应的对象,把后面同名的键值对直接忽略了,所以导入到MongoDB后自然看不到第二个"b"的内容。
你提供的原始JSON里就存在这个问题:
{ "timestamp":"100", "layers":{ "a":{ "aa":"0", "ab":"1", "ac":"2" }, "b": { "ba":"0", "bb":"1", "bc":"2" }, "b": { "missing": "1", "missing2": "2" } } }
layers对象下有两个完全相同的"b"键,这本身就不符合JSON语法规则,在导入前的解析阶段就已经丢失了第二个b的数据,和MongoDB的导入工具无关。
两种可行的修复方案
要解决这个问题,你得先把JSON调整为合法结构,这里给你两种常用思路:
方案1:将重复的b改为数组
如果这两个b对象是同类型的条目,最合理的做法是把它们放到一个数组里,修改后的JSON如下:
{ "timestamp":"100", "layers":{ "a":{ "aa":"0", "ab":"1", "ac":"2" }, "b": [ { "ba":"0", "bb":"1", "bc":"2" }, { "missing": "1", "missing2": "2" } ] } }
导入后,layers.b会变成一个包含两个对象的数组,你查询时就能看到所有预期内容。
方案2:给重复键添加唯一后缀
如果这两个b是不同类型的实体,只是命名重复,直接给它们改个唯一的键名即可:
{ "timestamp":"100", "layers":{ "a":{ "aa":"0", "ab":"1", "ac":"2" }, "b1": { "ba":"0", "bb":"1", "bc":"2" }, "b2": { "missing": "1", "missing2": "2" } } }
这样导入后,两个对象会以b1和b2的键名分别存在,不会被互相覆盖。
验证修复结果
修改好JSON后,重新执行你的导入命令:
mongoimport --db myDB --collection myCollection --file abc.json
再执行查询语句:
db.myCollection.find().limit(1)
这时候就能看到所有你想要的内容啦。
内容的提问来源于stack exchange,提问作者anstue
相关产品推荐
相关产品推荐

