MongoDB数据库操作将int类型改为字符串类型

这篇博客介绍了如何在MongoDB中使用JavaScript将文档类型的字段转换为字符串类型,具体操作是通过`find`和`forEach`遍历集合,然后利用赋值操作将`advertPosition`字段从int类型转为字符串。

db.getCollection(‘test_point’).find({_id:{$exists:true}}).forEach(function(x){
x.body.advertPosition=x.body.advertPosition+"";
db.getCollection(‘test_point’).save(x);
});

这样就可以将document类型的body字段中的int类型的advertPosition字段改为字符串类型

将项目中的 **MongoDB** 替换为 **MySQL** 是一个典型的从 NoSQL 到 SQL 的迁移过程,涉及多个层面的重构:数据模型、持久层技术栈、配置、实体类和业务逻辑等。 下面我将详细说明如何系统性地完成这一转换,并提供可运行的代码示例。 --- ## 🧭 迁移步骤概览 | 步骤 | 内容 | |------|------| | 1️⃣ | 移除 MongoDB 相关依赖与配置 | | 2️⃣ | 添加 MySQL + JPA/Hibernate 依赖 | | 3️⃣ | 将文档型数据模型转为关系型表结构 | | 4️⃣ | 重写实体类(Entity) | | 5️⃣ | 替换 Repository 接口 | | 6️⃣ | 更新 application.yml 配置 | | 7️⃣ | 数据迁移(可选) | | 8️⃣ | 测试验证 | --- ## ✅ 第一步:移除 MongoDB 相关内容 ### 删除或注释以下内容: #### `pom.xml` 中的 MongoDB 依赖 ```xml <!-- 删除 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> ``` #### 删除自定义配置类(如 MongoConfig) ```java // 删除或重命名 MongoConfig.java ``` #### 删除使用 `@Document` 注解的实体类(稍后重建) --- ## ✅ 第二步:添加 MySQL + JPA 依赖 在 `pom.xml` 中加入: ```xml <!-- MySQL Driver --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- Spring Data JPA --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` > 💡 JPA(Java Persistence API)是 Java 标准 ORM 规范,Hibernate 是其实现。 --- ## ✅ 第三步:设计 MySQL 表结构(以用户为例) 假设原 MongoDB 文档如下: ```json { "_id": "60b8d...", "username": "alice", "email": "alice@example.com", "age": 25, "createdAt": "2023-01-01T00:00:00Z" } ``` 对应 MySQL 表: ```sql CREATE DATABASE iogame; USE iogame; CREATE TABLE user ( id BIGINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL, age INT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); ``` --- ## ✅ 第四步:创建 JPA 实体类(Entity) ```java // src/main/java/com/example/entity/User.java import javax.persistence.*; import java.time.LocalDateTime; @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false, unique = true) private String username; @Column(nullable = false) private String email; private Integer age; @Column(name = "created_at", nullable = false, updatable = false) private LocalDateTime createdAt = LocalDateTime.now(); // 构造函数 public User() {} public User(String username, String email, Integer age) { this.username = username; this.email = email; this.age = age; } // Getters and Setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public LocalDateTime getCreatedAt() { return createdAt; } public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; } } ``` > ⚠️ 注意: > - 使用 `javax.persistence.*` 包 > - 字段映射通过 `@Column` 控制 > - 时间自动填充可以用 `@CreatedDate`(需启用审计) --- ## ✅ 第五步:替换 Repository 层 ### 原来使用的是 `MongoRepository`: ```java public interface UserRepository extends MongoRepository<User, String> { } ``` ### 改为使用 `JpaRepository`: ```java // src/main/java/com/example/repository/UserRepository.java import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface UserRepository extends JpaRepository<User, Long> { // 可以添加查询方法,例如: User findByUsername(String username); User findByEmail(String email); } ``` Spring Data JPA 会自动实现这些接口。 --- ## ✅ 第六步:更新 `application.yml` ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/iogame?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true username: root password: yourpassword driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update # 开发环境可用 create / update;生产建议 validate 或 none show-sql: true properties: hibernate: format_sql: true dialect: org.hibernate.dialect.MySQL8Dialect ``` > 🔍 参数解释: > - `ddl-auto: update` → 自动根据 Entity 创建/更新表结构 > - `useSSL=false` → 若本地测试无证书可用 > - `serverTimezone=UTC` → 防止时区错误 --- ## ✅ 第七步:服务层和服务调用不变(理想情况下) 你的 `UserService` 大致可以保持不变: ```java @Service public class UserService { @Autowired private UserRepository userRepository; public List<User> getAllUsers() { return userRepository.findAll(); } public User saveUser(User user) { return userRepository.save(user); } public Optional<User> findById(Long id) { return userRepository.findById(id); } } ``` ✅ 这体现了 Spring Data 抽象的好处:更换底层数据库时,上层逻辑影响小。 --- ## ✅ 第八步:启动类检查 确保主类上有 `@SpringBootApplication`,它包含了: - `@Configuration` - `@EnableAutoConfiguration` - `@ComponentScan` ```java @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` --- ## ✅ 可选:启用 JPA 审计(替代 MongoDB 的 `@CreatedDate`) 如果你之前用了 `@EnableMongoAuditing` 和 `@CreatedDate`,现在改为: ```java @EntityListeners(AuditingEntityListener.class) public class User { ... @CreatedDate @Column(name = "created_at", nullable = false, updatable = false) private LocalDateTime createdAt; } ``` 并在配置类中启用审计: ```java @Configuration @EnableJpaAuditing public class JpaConfig { } ``` --- ## ✅ 最终目录结构 ``` src/ └── main/ ├── java/ │ └── com.example/ │ ├── Application.java │ ├── entity/User.java │ ├── repository/UserRepository.java │ └── service/UserService.java └── resources/ └── application.yml ``` --- ## ✅ 启动测试 1. 确保 MySQL 已启动: ```bash sudo systemctl start mysql ``` 2. 运行 Spring Boot 应用 3. 检查日志是否输出类似: ``` Creating table 'user' Inserting initial data... ``` 4. 访问 `/users` 接口测试 CRUD 功能 --- ## 🔄 补充:数据迁移(从 MongoDB 导出 → MySQL 导入) 你可以写一个一次性脚本导出数据: ```java @Component public class MigrationService { @Autowired private MongoTemplate mongoTemplate; @Autowired private UserRepository userRepository; @PostConstruct public void migrateUsers() { List<UserDoc> users = mongoTemplate.findAll(UserDoc.class, "users"); // 原集合名 for (UserDoc doc : users) { User user = new User(doc.getUsername(), doc.getEmail(), doc.getAge()); user.setCreatedAt(doc.getCreatedAt()); userRepository.save(user); } System.out.println("✅ 用户数据迁移完成:" + users.size() + " 条"); } } ``` > ⚠️ 迁移完成后记得删除此代码! --- ## ❗注意事项 | 项目 | 说明 | |------|------| | 💾 数据类型差异 | MongoDB 是动态 schema,MySQL 是强类型,注意字段长度、null 约束等 | | 🔗 关联关系 | MongoDB 内嵌文档 → MySQL 需要外键或 JOIN | | 📈 性能考量 | MySQL 查询性能依赖索引,记得加 `@Index` | | 🛑 不支持 `_id` 作为字符串主键 | 建议改用 `BIGINT AUTO_INCREMENT` | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值