MongoDB是一种文档数据库,使用JSON格式存储数据,支持复杂的查询和聚合操作。它是一个分布式的、高性能的、开源的NoSQL数据库,具有高可扩展性和灵活性,适合大规模数据存储和处理。MongoDB的主要特点包括:
- 非关系型数据库:与传统关系型数据库不同,MongoDB采用文档存储方式,文档可以嵌套其他文档或数组,更加灵活自由。
- 高可扩展性:MongoDB支持水平扩展,可以方便地进行集群部署,适合海量数据存储和高并发读写操作。
- 高性能:MongoDB使用内存映射文件的方式进行数据读写,可以快速地进行数据访问和查询操作。
- 多样的数据模型:MongoDB支持多种数据模型,包括文档、键值、图形、列式等多种数据结构,可以满足不同场景下的需求。
- 强大的查询和聚合功能:MongoDB支持多种查询操作,包括范围查询、全文搜索、地理位置查询等,同时支持聚合操作,可以进行复杂的数据分析和统计。 总之,MongoDB是一款具有高性能、高可扩展性和灵活性的文档数据库,适合存储和处理大规模的非结构化数据
适合场景
- 需要存储大量非结构化数据的应用:MongoDB的文档存储方式非常适合存储非结构化的数据,例如日志、社交媒体数据、传感器数据等。
- 需要进行高并发读写操作的应用:MongoDB支持水平扩展,可以方便地进行集群部署,适合处理高并发读写请求。
- 需要进行复杂数据查询和聚合操作的应用:MongoDB支持强大的查询和聚合功能,可以进行复杂的数据分析和统计。
- 需要实时处理数据的应用:MongoDB支持实时数据处理,可以快速地进行数据读写操作。
- 需要支持灵活性和易扩展性的应用:MongoDB的非关系型数据库设计使其非常灵活,可以方便地进行修改和扩展。 总之,MongoDB适用于需要高性能、高可扩展性和灵活性的应用场景,特别是需要处理大规模非结构化数据的应用。
安装部署
- 拉取镜像
docker pull mongo
docker pull mongo-express
docker-compose.yml:
services:
mongo:
image: mongo
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: root
volumes:
- ./mongo_db:/data/db
mongo-express:
image: mongo-express
restart: always
ports:
- 8081:8081
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: root
ME_CONFIG_MONGODB_ADMINPASSWORD: root
- 运行容器
docker-compose up
与SpringBoot集成
- 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
- 配置连接信息
spring:
data:
mongodb:
host: 192.168.48.40
port: 27017
username: ecs
password: 123456
database: ecs
- 定义实体类和repository
使用@Document注解指定mongodb的集合名称:
@Document(collection = "users")
public class User {
@Id
private String id;
private String name;
private int age;
}
定义Repository,继承MongoRepository接口,可以继承其他的接口,例如SortingRepository、PagingAndSortingRepository等:
@Repository
public interface UserRepository extends MongoRepository<User, String> {
List<User> findByName(String name);
List<User> findByAgeGreaterThan(int age);
}
- 使用repository进行CRUD操作
使用自动注入的UserRepository对象进行CRUD操作:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public void save(User user) {
userRepository.save(user);
}
public List<User> findByName(String name) {
return userRepository.findByName(name);
}
public List<User> findByAgeGreaterThan(int age) {
return userRepository.findByAgeGreaterThan(age);
}
}
常用方法
- 获取连接对象
MongoClient mongoClient = new MongoClient("localhost", 27017);
- 获取数据库和集合操作对象
MongoDatabase database = mongoClient.getDatabase("test");
MongoCollection<Document> collection = database.getCollection("users");
- 插入文档
Document doc = new Document("name", "张三").append("age", 20);
collection.insertOne(doc);
- 查询文档
FindIterable<Document> docs = collection.find(new Document("name", "张三"));
for (Document doc : docs) {
System.out.println(doc.toJson());
}
- 更新文档
collection.updateOne(new Document("name", "张三"), new Document("$set", new Document("age", 30)));
- 删除文档
collection.deleteOne(new Document("name", "张三"));
- 关闭连接
collection.deleteOne(new Document("name", "张三"));