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

如何用Spring Data MongoDB实现存在则删文档后插入新数据

解决方案

问题根源分析

当前代码存在多个关键问题导致插入失败:

  1. SQL语句语法错误:SELECT * FROM ORGANISATIONS缺少闭合引号,会直接导致数据库查询失败
  2. ResultSet遍历逻辑错误:Java的ResultSet没有length属性,原遍历方式不会执行循环体,自然没有数据插入
  3. 方法调用错误:用Facility.setXXX直接调用实例方法,会触发编译报错,根本无法执行插入逻辑
  4. 缺失MongoDB预删除步骤:没有先清除目标设施的旧数据,同时旧的语法错误导致新数据根本没被插入

修正后的完整代码

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import java.sql.ResultSet;
import java.sql.Statement;

// 1. 先删除MongoDB中所有关联目标设施名称的文档
Query deleteQuery = new Query(Criteria.where("facilityName").is(basename));
mongoTemplate.remove(deleteQuery, Facility.class);

// 2. 从SQL数据库读取新的设施数据
Statement orgStmt = conn.createStatement();
// 修复SQL语句的引号问题
ResultSet result = orgStmt.executeQuery("SELECT * FROM ORGANISATIONS");

// 正确遍历ResultSet(JDBC标准方式)
while (result.next()) {
    Facility facility = new Facility();
    // 使用实例调用setter方法,而非类名
    facility.setFacilityId(result.getString(1));
    facility.setFacilityCode(result.getString(2));
    facility.setFacilityName(basename);
    // 插入新记录:设施不存在时自动创建新文档,存在时覆盖
    visitList.save(facility);
}

// 关闭数据库资源
result.close();
orgStmt.close();
conn.close(); // 记得关闭SQL数据库连接

关键说明

  • 预删除逻辑:通过MongoTemplate构建删除查询,根据facilityName清除所有旧文档,确保插入的是最新数据
  • ResultSet遍历:result.next()是JDBC标准的结果集遍历方式,会逐行读取查询结果
  • 实体操作修正:必须通过Facility的实例调用setter方法,类名直接调用属于语法错误
  • save方法特性:Spring Data MongoDB的save方法会自动判断实体状态:无匹配_id时插入新文档,有匹配时更新,无需担心设施名称是否已存在

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:05:26