如何在Ruby中将同一产品ID的多个JSON存入MongoDB单文档
解决Ruby中同一产品ID的多个JSON文件存入MongoDB单文档的问题
问题分析
你需要将同一产品ID对应的多个JSON文件集中存储到MongoDB的单个文档中,核心需求是通过产品ID匹配文档,将每个JSON对象追加到文档的数组字段里。你的现有代码存在语法和逻辑问题,导致$push操作无法生效。
关键错误修正
- 数据库连接参数错误:拼写错误
:dtaabase应为:database,同时要指定正确的数据库名test_db和集合名test_coll。 - 更新操作语法错误:Ruby MongoDB驱动需使用
update_one(单文档更新),参数需严格遵循「查询条件、更新操作、选项」的结构。 - 冗余JSON转换:
JSON.parse(json_array.to_json)属于无效操作,直接使用解析后的Ruby哈希即可。
修正后的实现代码
1. 基础连接与单个JSON文件处理
require 'mongo' require 'json' # 初始化MongoDB客户端 client = Mongo::Client.new(['127.0.0.1:27017'], database: 'test_db') coll = client[:test_coll] # 读取并解析单个JSON文件 json_content = File.read('path/to/your/product.json') json_data = JSON.parse(json_content) # 获取产品ID(根据你的JSON结构调整字段名) single_id_product = json_data['product_id'] # 执行更新:匹配id字段,将当前JSON数据追加到json_files数组 coll.update_one( { id: single_id_product }, { '$push': { json_files: json_data } }, upsert: true )
2. 批量处理多个JSON文件
如果需要批量处理目录下所有对应产品ID的JSON文件,可使用目录遍历:
require 'mongo' require 'json' client = Mongo::Client.new(['127.0.0.1:27017'], database: 'test_db') coll = client[:test_coll] # 遍历指定目录下的所有JSON文件 Dir.glob('./product_jsons/*.json').each do |file_path| json_data = JSON.parse(File.read(file_path)) product_id = json_data['product_id'] # 替换为你实际的产品ID字段 # 更新或插入文档:不存在则创建,存在则追加JSON到数组 result = coll.update_one( { id: product_id }, { '$push': { json_files: json_data } }, upsert: true ) # 可选:打印操作日志 puts "文件 #{file_path}: #{result.upserted_id ? '创建新文档' : '更新现有文档'}" end
最终MongoDB文档结构
执行后,每个产品ID对应的文档结构如下:
{ "_id": ObjectId("60d21b4667d0d8992e610c85"), "id": "PROD-001", "json_files": [ { "product_id": "PROD-001", "name": "产品A", "price": 100 }, { "product_id": "PROD-001", "stock": 50, "category": "电子产品" } ] }
补充说明
$push操作会将新的JSON对象追加到json_files数组末尾,确保同一产品ID的所有JSON数据都存储在单个文档中。upsert: true参数确保当匹配的产品ID文档不存在时,自动创建新文档并插入第一条JSON数据。
内容的提问来源于stack exchange,提问作者JACKoJONS
相关产品推荐
相关产品推荐

