MongoDB

概述

  • MongoDB 与传统关系型数据库相比更加简单,架构为key-value结构
  • MySQL数据库:数据库-表-记录 MongoDB :数据库-集合-文档(记录)
  • 文档类似于JSON对象,结构成为BSON

安装与启动

1. 导入 MongoDB 官方 GPG 密钥

首先需要导入 MongoDB 官方的 GPG 密钥,以便系统能够验证下载包的完整性。

curl -fsSL https://pgp.mongodb.com/server-7.0.asc | \
   sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg \
   --dearmor

2. 添加 MongoDB 软件源

将 MongoDB 的软件源添加到系统的源列表中,这样就可以通过包管理器直接下载 MongoDB。

echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

3. 更新包索引

添加完软件源后,需要更新本地的包索引,让系统知道有哪些新的软件包可以安装。

sudo apt-get update

4. 安装 MongoDB 7.0.0

使用包管理器安装指定版本的 MongoDB。

sudo apt-get install -y mongodb-org=7.0.0 mongodb-org-database=7.0.0 mongodb-org-server=7.0.0 mongodb-org-shell=7.0.0 mongodb-org-mongos=7.0.0 mongodb-org-tools=7.0.0

5. 锁定 MongoDB 版本

为了防止系统自动升级 MongoDB 版本,需要对其进行版本锁定。

echo "mongodb-org hold" | sudo dpkg --set-selections
echo "mongodb-org-database hold" | sudo dpkg --set-selections
echo "mongodb-org-server hold" | sudo dpkg --set-selections
echo "mongodb-org-shell hold" | sudo dpkg --set-selections
echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
echo "mongodb-org-tools hold" | sudo dpkg --set-selections

6. 启动 MongoDB 服务

安装完成后,启动 MongoDB 服务并设置为开机自启动。

sudo systemctl start mongod
sudo systemctl enable mongod

7. 验证安装结果

通过以下命令检查 MongoDB 服务的运行状态,确认是否安装成功。

sudo systemctl status mongod

Linux进入MongoDB

mongosh
show dbs  # 查看数据库
db.version() # 查看版本  
db.getMongo()  # 查看当前db的链接机器地址
db.help()    # 帮助
quit()       # 退出

命令行操作MongoDB

数据库操作

创建数据库,如果数据库不存在,则创建数据库,否则切换数据库

use 库名

查看当前数据库

db.getName()

查看当前数据库状态

db.stats()

删除当前数据库

db.dropDatabase()

集合操作

创建集合

db.createCollection("User")

删除集合

db.集合名.drop()

文档操作

注意:

  • MongoDB区分类型和大小写
  • MongoDB文档不能有重复的键

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

db.集合名.insert({name:'zhangsan',age:21,sex:true})

find,查询当前集合中name是zhangsan的数据,空参的话是查询全部

db.集合名.find({name:zhangsan})

update,只更新匹配到的第一条记录

db.集合名.update({age:21},{$set:{name:100})

更新匹配到的所有记录

db.集合名.update({age:21},{set:{name:100}},{multi:true})

remove,删除一个文档

db.集合名.remove(id)

删除所有文档

db.集合名.remove({})

SpringBoot整合MongoDB

  • spring-data-mongodb提供了两种方式

第一种 MongoTemplate(更灵活)

第二种 MongoRepository(操作简单)

准备工作

第一步 创建项目,导入依赖

<?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 http://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>

    <artifactId>mongo_demo0</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </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>

</project>

第二步 创建项目文件

application.yml

spring:
  data:
    mongodb:
      database: daijia
      host: 47.107.42.25
      port: 27017

第三步 创建实体类

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

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

MongoRepository

  • 添加interface继承MongoRepository
public interface UserRepository extends MongoRepository<User, ObjectId> {
}

普通方法

  • 编写测试类
@SpringBootTest
public class MongoRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    //添加
    @Test
    public void add() {
        User user = new User();
        user.setName("mary");
        user.setAge(30);
        user.setCreateDate(new Date());
        userRepository.save(user);
    }

    //查询所有
    @Test
    public void findAll() {
        List<User> list = userRepository.findAll();
        System.out.println(list);
    }

    //根据id查询
    @Test
    public void testFindById() {
        Optional<User> optional =
                userRepository.findById(new ObjectId("666a9a85f5294513720647ff"));
        boolean present = optional.isPresent();
        if(present) {
            User user = optional.get();
            System.out.println(user);
        }
    }

    //条件查询 + 排序
    // age = 20
    @Test
    public void testFindCondition() {
        //封装条件
        User user = new User();
        user.setAge(20);
        Example<User> example = Example.of(user);

        Sort sort = Sort.by(Sort.Direction.DESC, "name");

        List<User> list = userRepository.findAll(example, sort);
        System.out.println(list);
    }

    //分页查询
    @Test
    public void testPage() {
        //第一页从0开始的
        PageRequest pageable = PageRequest.of(0,2);

        Page<User> page = userRepository.findAll(pageable);

        List<User> list = page.getContent();
        System.out.println(list);
    }

    //更新
    @Test
    public void testUpdateUser(){
        //注意:先查询,再更新
        Optional<User> optional = userRepository.findById(
                new ObjectId("64eee9dff317c823c62b4faf")
        );
        if(optional.isPresent()){
            User user = optional.get();
            user.setAge(100);
            //user中包含id,就会执行更新
            userRepository.save(user);
            System.out.println(user);
        }
    }

    //删除
    @Test
    public void testDeleteUser(){
        userRepository.deleteById(
                new ObjectId("64eee9dff317c823c62b4faf")
        );
    }
}

命名方法

  • MongoRepository也可以按照规则在把查询方法创建出来

总体规模:

  • 查询方法 以 get | find | read开头
  • 后面街上查询字段名称,满足大驼峰命名
  • 字段查询条件添加关键字,比如like

比如:

@Repository  
public interface OrderServiceLocationRepository extends MongoRepository<OrderServiceLocation, String> {  
  
    // 根据订单id获取位置信息,按照创建时间排序  
    List<OrderServiceLocation> findByOrderIdOrderByCreateTimeAsc(Long orderId);  
}

MongoTemplate

@SpringBootTest
public class MongoTemplateTest {

    @Autowired
    private MongoTemplate mongoTemplate;

    //添加
    @Test
    public void add() {
        User user = new User();
        user.setName("test");
        user.setAge(20);
        user.setCreateDate(new Date());
        mongoTemplate.insert(user);
    }

    //查询所有
    @Test
    public void findAll() {
        List<User> list = mongoTemplate.findAll(User.class);
        list.forEach(user->{
            System.out.println(user);
        });
    }

    //根据id查询
    @Test
    public void testFindId() {
        User user = mongoTemplate.findById("666a9b5e9a3653796627bb3c", User.class);
        System.out.println(user);
    }

    //条件查询
    @Test
    public void testCondition() {
        // where name=? and age=?
        Criteria criteria =
                Criteria.where("name").is("test").and("age").is(20);
        Query query = new Query(criteria);

        List<User> list = mongoTemplate.find(query,User.class);
        System.out.println(list);
    }

    //分页查询
    @Test
    public void testPage() {
        // limit 0,2
        Query query = new Query();
        List<User> list = mongoTemplate.find(query.skip(0).limit(2), User.class);
        list.forEach(user->{
            System.out.println(user);
        });
    }

    //修改和删除
    //修改
    @Test
    public void testUpdateUser() {
        Criteria criteria = Criteria.where("_id").is("64eeeae31711344f35635788");
        Query query = new Query(criteria);
        Update update = new Update();
        update.set("name", "zhangsan");
        update.set("age", 99);
        UpdateResult result = mongoTemplate.upsert(query, update, User.class);//改一条
        //UpdateResult result = mongoTemplate.updateMulti(query, update, User.class);//改多条
        long count = result.getModifiedCount();
        System.out.println(count);
    }

    //删除
    @Test
    public void testRemove() {
        Criteria criteria = Criteria.where("_id").is("64eeeae31711344f35635788");
        Query query = new Query(criteria);
        DeleteResult result = mongoTemplate.remove(query, User.class);
        long count = result.getDeletedCount();
        System.out.println(count);
    }
}
Posted on:
June 17, 2025
Length:
4 minute read, 658 words
Tags:
project
See Also:
CompletableFuture异步编排
分布式事物锁
快速上手xxl-job