如何用Ruby在MongoDB中合并JSON并处理重复文档插入?
用Ruby操作MongoDB:合并JSON文档与去重导入实现
当然可以用Ruby来处理MongoDB中的JSON文档合并!而且完全不需要依赖Rails环境,用纯Ruby脚本就能搞定你需求的「读取JSON文件导入、检查重复并合并文档」的功能。下面一步步给你说明实现方法:
第一步:准备依赖
首先确保你的Ruby环境已经安装了MongoDB官方驱动,打开命令行执行:
gem install mongo
第二步:编写核心脚本
你可以在Notepad++里新建一个.rb文件,把下面的代码复制进去,再根据你的实际情况修改配置项:
require 'mongo' require 'json' # -------------------------- 配置项 -------------------------- MONGO_URI = 'localhost:27017' # MongoDB地址,按需修改 DB_NAME = 'your_database' # 目标数据库名 COLLECTION_NAME = 'your_collection' # 目标集合名 JSON_FILE_PATH = 'data.json' # 你的JSON文件路径 DUPLICATE_KEY = 'Name' # 判断重复的字段(比如示例中的Name) # ----------------------------------------------------------- # 连接MongoDB client = Mongo::Client.new([MONGO_URI], database: DB_NAME) collection = client[COLLECTION_NAME] # 读取并解析JSON文件 begin json_content = File.read(JSON_FILE_PATH) docs_to_import = JSON.parse(json_content) rescue Errno::ENOENT puts "错误:找不到文件 #{JSON_FILE_PATH}" exit 1 rescue JSON::ParserError puts "错误:JSON文件格式不正确" exit 1 end # 逐个处理文档 docs_to_import.each do |new_doc| # 根据指定字段查找已有文档 existing_doc = collection.find_one({ DUPLICATE_KEY => new_doc[DUPLICATE_KEY] }) if existing_doc # 存在重复,执行合并逻辑 puts "发现重复文档:#{new_doc[DUPLICATE_KEY]},开始合并..." # 示例:合并Files数组(按文件名称去重) existing_files = existing_doc['Files'] || [] new_files = new_doc['Files'] || [] merged_files = (existing_files + new_files).uniq { |file| file['Name'] } # 更新现有文档:替换Files数组,如需合并其他字段可扩展$set内容 collection.update_one( { '_id' => existing_doc['_id'] }, { '$set' => { 'Files' => merged_files } } ) # 如果你需要合并所有字段(相同字段用新文档值覆盖,新增字段保留),可以用$mergeObjects(MongoDB 4.2+支持) # collection.update_one( # { '_id' => existing_doc['_id'] }, # { '$mergeObjects' => new_doc } # ) puts "合并完成:#{new_doc[DUPLICATE_KEY]}" else # 无重复,直接插入新文档 collection.insert_one(new_doc) puts "插入新文档:#{new_doc[DUPLICATE_KEY]}" end end # 关闭数据库连接 client.close puts "所有文档处理完成!"
关键逻辑说明
- 重复判断:示例中用
Name字段作为重复标识,你可以根据实际需求修改DUPLICATE_KEY,甚至用多个字段组合(比如{ 'Name' => new_doc['Name'], 'Email' => new_doc['Email'] })。 - 合并规则:
- 对于数组类型的字段(比如示例中的
Files),我们采用「合并后按子字段去重」的逻辑,避免重复的文件条目。 - 如果是普通键值对字段,推荐用MongoDB的
$mergeObjects操作符(需MongoDB 4.2及以上版本),它会自动合并新旧文档的字段,相同字段会被新文档的值覆盖,新字段则会添加进去。
- 对于数组类型的字段(比如示例中的
- 错误处理:脚本里加了基础的文件不存在和JSON格式错误的捕获,你可以根据需要扩展更多异常处理逻辑。
运行脚本
保存好脚本后,打开命令行,切换到脚本所在目录,执行:
ruby your_script_name.rb
这样就能完成JSON文件的导入、去重和合并操作啦!
内容的提问来源于stack exchange,提问作者Siya
相关产品推荐
相关产品推荐

