You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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 "所有文档处理完成!"

关键逻辑说明

  1. 重复判断:示例中用Name字段作为重复标识,你可以根据实际需求修改DUPLICATE_KEY,甚至用多个字段组合(比如{ 'Name' => new_doc['Name'], 'Email' => new_doc['Email'] })。
  2. 合并规则:
    • 对于数组类型的字段(比如示例中的Files),我们采用「合并后按子字段去重」的逻辑,避免重复的文件条目。
    • 如果是普通键值对字段,推荐用MongoDB的$mergeObjects操作符(需MongoDB 4.2及以上版本),它会自动合并新旧文档的字段,相同字段会被新文档的值覆盖,新字段则会添加进去。
  3. 错误处理:脚本里加了基础的文件不存在和JSON格式错误的捕获,你可以根据需要扩展更多异常处理逻辑。

运行脚本

保存好脚本后,打开命令行,切换到脚本所在目录,执行:

ruby your_script_name.rb

这样就能完成JSON文件的导入、去重和合并操作啦!

内容的提问来源于stack exchange,提问作者Siya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:30:22