MongoDB基本使用

MongoDB入门

MongoDB 概念

什么是MongoDB

MongoDB 是在2007年由DoubleClick公司的几位核心成员开发出的一款**分布式文档(数据)**数据库,由C++语言编写。

目的是为了解决数据大量增长的时候系统的可扩展性和敏捷性。MongoDB要比传统的关系型数据库简单很多。

在MongoDB中数据主要的组织结构就是数据库、集合和文档,文档存储在集合当中,集合存储在数据库中。

MongoDB中每一条数据记录就是一个文档,数据结构由键值(key=>value)对组成

文档类似于 JSON 对象,它的数据结构被叫做BSON(Binary JSON)。

MongoDB中的一些概念:

RDBMS MongoDB
数据库 数据库
表格 集合
文档
字段
表联合 嵌入文档
主键 _id

MongoDB适用场景

MongoDB不需要去明确指定一张表的具体结构,对字段的管理非常灵活,有很强的可扩展性。

支持高并发、高可用、高可扩展性,自带数据压缩功能,支持海量数据的高效存储和访问。

支持基本的CRUD、数据聚合、文本搜索和地理空间查询功能。

适用场景:

  • 网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
  • 高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。
  • 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
  • 缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。

例如:

弹幕、直播间互动信息、朋友圈信息、物流场景等。

  • 海量数据
  • 频繁增删改
  • 数据价值不高(没有强事务要求)

注意:低版本的MongoDB不支持事务。

安装和启动(docker方式)

拉取镜像

shell 复制代码
docker pull mongo:7.0.0

创建和启动容器

需要在宿主机建立文件夹

rm -rf /opt/mongo

mkdir -p /opt/mongo/data/db

shell 复制代码
docker run -d --restart=always -p 27017:27017 --name mongo -v /opt/mongo/data/db:/data/db mongo:7.0.0

进入容器

shell 复制代码
docker exec -it mongo mongo

基本命令

shell 复制代码
show dbs
db.version() #当前db版本
db.getMongo() #查看当前db的连接机器地址
db.help() #帮助
quit() #退出命令行

客户端远程远程连接

可以下载客户端:Release Notes --- MongoDB Compass

也可以下载Robo 3T | Free, open-source MongoDB GUI (formerly Robomongo)

本文使用第一个。

数据库操作

创建数据库

如果数据库不存在,则创建数据库,否则切换到指定数据库。

shell 复制代码
use userdb

查看当前数据库

复制代码
db.getName()

显示当前数据库状态

复制代码
db.stats()

删除当前数据库

复制代码
db.dropDatabase()

集合操作

创建集合

shell 复制代码
db.createCollection("User")

删除集合

shell 复制代码
db.User.drop()

文档操作

文档是一组键值(key-value)对

需要注意的是:

1、MongoDB区分类型和大小写。

2、MongoDB的文档不能有重复的键。

insert

向User集合插入一条记录。可以预先使用createCollection方法创建集合,也可以不创建集合,直接插入数据,那么集合会被自动创建

shell 复制代码
db.User.insert({name:'zhangsan',age:21,sex:true})

query

查询当前User集合中所有的记录

shell 复制代码
db.User.find()

查询当前User集合中name是zhangsan的记录

shell 复制代码
db.User.find({name:"zhangsan"})

update

只更新匹配到的第一条记录 $set修改器不会将已有字段删除

shell 复制代码
db.User.update({age:21}, {$set:{name:100}}) 

更新匹配到的所有记录

shell 复制代码
db.User.update({age:21}, {$set:{age:99}}, {multi: true})

remove

移除一个文档

shell 复制代码
db.User.remove(id)

移除所有文档

shell 复制代码
db.User.remove({}) 

索引操作

海量数据实现条件高效率查询,全集合扫描性能相对较低,针对于查询字段创建索引(单列索引,复合索引)

查看执行计划

复制代码
db.集合名称.find({条件}).explain()

对频繁查询字段建立索引

复制代码
db.集合名称.createIndex({字段:1})  #1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1
db.User.createIndex({name:1,age:1})

**更多命令参考:**https://www.runoob.com/mongodb/mongodb-tutorial.html

SpringBoot集成MongoDB

spring-data-mongodb提供了MongoTemplateMongoRepository两种方式访问mongodb,MongoRepository操作简单,MongoTemplate操作灵活,我们在项目中可以灵活使用这两种方式操作mongodb。

集成spring-data-mongodb

搭建项目

1、创建项目:mongo_demo

2、导入pom.xml:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>mongo_demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--mongodb-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3、添加配置文件

application.yml

yaml 复制代码
spring:
  data:
    mongodb:
      database: user
      host: 192.168.200.6
      port: 27017

4、提供启动类

java 复制代码
package com.example.mongo_demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author: example
 * @create: 2023-10-30 10:35
 */
@SpringBootApplication
public class MongoDemoApp {

    public static void main(String[] args) {
        SpringApplication.run(MongoDemoApp.class);
    }
}

添加实体

java 复制代码
package com.example.mongo_demo.model;

import lombok.Data;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.Date;

@Data
@Document("user") //指定mongodb中的集合名字
public class User {

    @Id
    private ObjectId id;
    private String name;
    private Integer age;
    private String email;
    private Date createDate;
}

MongoRepository

添加Repository类

java 复制代码
package com.example.mongo_demo.repository;

import com.example.mongo_demo.model.User;
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.repository.MongoRepository;

/**
 * @author: example
 * @create: 2023-10-30 10:42
 */
public interface UserRepository extends MongoRepository<User, ObjectId> {

}

创建测试类

test目录创建测试类:MongoRepositoryTest

java 复制代码
package com.example.mongo_demo;

import com.example.mongo_demo.MongoDemoApp;
import com.example.mongo_demo.model.User;
import com.example.mongo_demo.repository.UserRepository;
import org.bson.types.ObjectId;
import org.junit.jupiter.api.Test;
import org.junit.platform.engine.discovery.UniqueIdSelector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.*;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest//(classes = MongoDemoApp.class)
class MongoDemoAppTest {


    @Autowired
    private UserRepository userRepository;


    @Test
    public void testCRUD(){
        //新增文档
        //User user = new User();
        //user.setName("张三");
        //user.setAge(21);
        //user.setEmail("zhangsan@qq.com");
        user.setId(new ObjectId("abc"));
        //userRepository.save(user);

        //根据ID查询文档
        //ObjectId objectId = new ObjectId("653f195b13a2b265350f36a2");
         OptionalJDK提供封装结果容器对象,如果该容器中没有数据报错NoSuchElementException 调用get方法先要判断isPresent()方法
        //Optional<User> optional = userRepository.findById(objectId);
        //if(optional.isPresent()){
        //    User user = optional.get();
        //    System.out.println(user);
        //}

        //查询列表
        //List<User> all = userRepository.findAll();
        //System.out.println(all);

        //条件查询 Example对象 封装文档对应实体类,实体类封装条件
        //User user = new User();
        //user.setName("赵六");
        //Example<User> example = Example.of(user);
        //
        //List<User> all = userRepository.findAll(example);
        //System.out.println(all);


        //分页查询
        //Pageable pageRequest = PageRequest.of(0, 10);
        //Page<User> page = userRepository.findAll(pageRequest);
        //List<User> collect = page.get().collect(Collectors.toList());
        //System.err.println(collect);
        //
        //System.out.println(page.getTotalElements());
        //System.out.println(page.getTotalPages());

        //Sort sort = Sort.by(Sort.Direction.DESC, "age");
        //List<User> all = userRepository.findAll(sort);
        //System.out.println(all);

        //User user1 = new User();
        //user1.setId(new ObjectId("653f195b13a2b265350f36a1"));
        //user1.setName("zhaoliu");
        //userRepository.save(user1);

        userRepository.deleteById(new ObjectId("653f195b13a2b265350f36a1"));
    }
}

MongoTemplate

test目录创建测试类:MongoTemplateTest

java 复制代码
@Autowired
private MongoTemplate mongoTemplate;

@Test
public void testTemplateCURD() {
    //1.增删改查
    //User user = new User();
    //user.setName("jack");
    //user.setAge(16);
    //user.setEmail("jack@qq.com");
    //mongoTemplate.save(user);

    //根据ObjectID查询
    //User user1 = mongoTemplate.findById("653f21941be7a2121f30adbf", User.class);
    //User user1 = mongoTemplate.findById(new ObjectId("653f21941be7a2121f30adbf"), User.class);
    //System.out.println(user1);

    //更新 更新条件query 更新内容update
    //Query query = new Query();
    //query.addCriteria(Criteria.where("name").is("jack"));
    //
    //
    //Update update = new Update();
    //update.set("age", 55);
    //mongoTemplate.updateFirst(query, update, User.class);

    //批量修改
    //Query query = new Query();
    //query.addCriteria(Criteria.where("age").is(55));
    //
    //
    //Update update = new Update();
    //update.set("age", 65);
    //mongoTemplate.updateMulti(query, update, "User");

    //Query query = new Query(Criteria.where("_id").is(new ObjectId("653f22fae9dd5a67e82c66f0")));
    //mongoTemplate.remove(query, "User");

    //查询列表
    //List<User> all = mongoTemplate.findAll(User.class);
    //System.out.println(all);


    //排序
    //Query query = new Query();
    //query.with(Sort.by(Sort.Direction.ASC, "age"));
    //List<User> users = mongoTemplate.find(query, User.class);
    //System.out.println(users);


    //分页
    //Query query = new Query();
    //PageRequest(页码,页大小)
    //query.with(PageRequest.of(1, 1));
    //query.skip((pageNum-1)*pageSize),limit(页大小)
    //query.skip(1).limit(1);
    //List<User> users = mongoTemplate.find(query, User.class);
    //System.out.println(users);


    //模糊查询
    String keyword = "os";
    Query query = new Query();
    //Pattern pattern = Pattern.compile("^.*ro.*$", Pattern.CASE_INSENSITIVE);
    query.addCriteria(Criteria.where("name").regex("^.*"+keyword+".*$"));
    List<User> users = mongoTemplate.find(query, User.class);
    System.out.println(users);
}
相关推荐
{⌐■_■}3 小时前
【Kafka】登录日志处理的三次阶梯式优化实践:从同步写入到Kafka多分区批处理
数据库·分布式·mysql·kafka·go
isNotNullX3 小时前
数据中台架构解析:湖仓一体的实战设计
java·大数据·数据库·架构·spark
睿思达DBA_WGX6 小时前
由 DB_FILES 参数导致的 dg 服务器无法同步问题
运维·数据库·oracle
袋鼠云数栈7 小时前
使用自然语言体验对话式MySQL数据库运维
大数据·运维·数据库·后端·mysql·ai·数据治理·数栈·data+ai
阿里云大数据AI技术7 小时前
数据 + 模型 驱动 AI Native 应用发展
大数据·数据库·人工智能
??? Meggie8 小时前
【SQL】使用UPDATE修改表字段的时候,遇到1054 或者1064的问题怎么办?
android·数据库·sql
一屉大大大花卷8 小时前
初识Neo4j之图数据库(二)
数据库·neo4j
天翼云开发者社区8 小时前
OLAP分析数据库适用场景及主流产品对比
数据库
Britz_Kevin9 小时前
从零开始的云计算生活——番外2,MySQL组复制
数据库·mysql·云计算·生活·#组复制