mongo 适应场景
docker 部署mongo
27017 端口 user / password
docker run -d \--name my-mongo \-p 27018:27017 \ # 宿主机 27018 映射到容器 27017-v /root/mongo/data:/data/db \-v /root/mongo/config:/data/configdb \-e MONGO_INITDB_ROOT_USERNAME=admin \-e MONGO_INITDB_ROOT_PASSWORD=123456 \mongo
在 MongoDB 中,查看文档(即查询集合中的数据)主要使用 find()
方法,常用命令如下:
1. 查看集合中所有文档
// 语法:db.集合名.find()
db.users.find() // 查看 users 集合中的所有文档(默认不格式化输出)// 格式化输出(更易读)
db.users.find().pretty()
2. 条件查询(指定筛选条件)
// 语法:db.集合名.find({条件})
// 示例1:查询 age 等于 25 的文档
db.users.find({ age: 25 }).pretty()// 示例2:查询 age 大于 18 且小于 30 的文档
db.users.find({ age: { $gt: 18, $lt: 30 } }).pretty()// 示例3:查询 name 为 "张三" 且 gender 为 "男" 的文档
db.users.find({ name: "张三", gender: "男" }).pretty()
3. 只返回指定字段(投影查询)
// 语法:db.集合名.find({条件}, {字段名: 1/0})
// 1: 显示该字段,0: 隐藏该字段(_id 默认显示,需手动隐藏)
// 示例:查询所有用户,只显示 name 和 age,隐藏 _id
db.users.find({}, { name: 1, age: 1, _id: 0 }).pretty()
4. 限制返回数量(分页)
// 只返回前 5 条
db.users.find().limit(5).pretty()// 跳过前 5 条,返回接下来的 5 条(常用于分页)
db.users.find().skip(5).limit(5).pretty()
5. 排序查询结果
// 语法:.sort({字段名: 1/-1}) 1: 升序,-1: 降序
// 示例:按 age 降序排列(从大到小)
db.users.find().sort({ age: -1 }).pretty()
6. 查看符合条件的第一条文档
// 等价于 find() 后取第一条,更简洁
db.users.findOne({ age: 25 }) // 自动格式化,无需加 pretty()
在 Spring Boot 中使用 MongoDB 主要通过 Spring Data MongoDB 框架实现,它简化了数据访问层的开发。以下是具体用法和适用场景:
一、Spring Boot 集成 MongoDB 步骤
1. 引入依赖(Maven)
在 pom.xml
中添加:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2. 配置连接信息
在 application.yml
中配置 MongoDB 连接:
spring:data:mongodb:uri: mongodb://admin:123456@localhost:27017/数据库名?authSource=admin# 说明:admin:123456 是用户名和密码,authSource=admin 指定认证数据库
3. 定义实体类(映射 MongoDB 文档)
使用 @Document
注解指定集合名:
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;@Document(collection = "user") // 对应 MongoDB 中的 user 集合
public class User {@Id // 映射文档的 _id 字段private String id;private String name;private Integer age;private String email;// 省略 getter、setter、构造方法
}
4. 创建数据访问层(Repository)
继承 MongoRepository
即可获得基本 CRUD 方法:
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;// User 是实体类,String 是主键类型
public interface UserRepository extends MongoRepository<User, String> {// 自定义查询方法(Spring Data 自动生成实现)List<User> findByAgeGreaterThan(Integer age); // 按年龄大于指定值查询User findByName(String name); // 按姓名查询
}
5. 业务层调用
在 Service 中注入 UserRepository
使用:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;@Service
public class UserService {@Autowiredprivate UserRepository userRepository;// 新增用户public User addUser(User user) {return userRepository.save(user);}// 查询所有用户public List<User> getAllUsers() {return userRepository.findAll();}// 按年龄查询public List<User> getUsersByAge(Integer age) {return userRepository.findByAgeGreaterThan(age);}
}
二、MongoDB 在 Spring Boot 中的适用场景
MongoDB 作为文档型数据库,适合以下场景:
1. 数据结构灵活多变的场景
- 例如电商商品(不同商品属性差异大,如服装有尺码、颜色,电子产品有内存、型号),无需固定表结构,新增属性无需修改 schema。
- 社交媒体内容(用户动态、评论,字段可能随时扩展,如添加“点赞数”“分享数”)。
2. 高写入/读取性能需求的场景
- 日志存储(如系统操作日志、用户行为日志,写入频率高,MongoDB 支持高并发写入)。
- 实时数据分析(通过索引优化,可快速查询海量数据)。
3. 海量数据存储与查询
- 用户画像(存储用户基本信息、行为标签等,数据量大但结构松散)。
- 物联网设备数据(传感器实时上报的数据,格式可能不统一)。
4. 快速迭代的业务
- 创业项目或新功能试错(无需前期设计复杂表结构,开发效率高)。
三、不适合的场景
- 强事务需求(如金融交易,虽然 MongoDB 4.0+ 支持事务,但不如关系型数据库成熟)。
- 复杂多表关联查询(MongoDB 是文档型,关联查询性能较差,适合数据嵌入而非关联)。
- 固定且严格的 schema 约束(如政务系统、医疗记录等需要强数据一致性的场景)。
通过 Spring Data MongoDB,开发者可以用类似操作关系型数据库的方式操作 MongoDB,同时发挥其灵活存储、高吞吐的优势,适合快速开发和处理非结构化/半结构化数据。