Spring Boot MongoDB

  1. Linux下启动MongoDB并使用mongosh连接

启动方式有两种:

  • systemctl start mongod
  • mongod

启动的时候有可能会报类似如下的错误:

ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=14)
mongod.service: Control process exited, code=exited status=14

当看到这种”code=exited, status=14″的时候,一般是文件或目录权限问题,即执行mongodb启动命令的用户对某些文件或目录没有访问权限,此时应检查一些几个文件或目录:

  • /var/run/mongodb/
  • /var/log/mongodb/
  • /var/lib/mongo/
  • /tmp/*.sock

看看这些文件或目录的所有者和所属组是否正确

chown -R mongodb:mongodb /var/lib/mongodb
chown -R mongodb:mongodb /var/log/mongodb/
chown -R mongodb:mongodb /var/run/mongodb/
chown mongodb:mongodb /tmp/mongodb-27017.sock

Spring Boot MongoDB

Spring Boot MongoDB

首先,不启用访问控制,创建一个用户管理员

然后,启用访问控制,用用户管理员认证,再创建其它用户

Spring Boot MongoDB

Spring Boot MongoDB

Spring Boot MongoDB

Spring Boot MongoDB

备忘录

ls -l /var/run/mongodb/
ls -l /var/log/mongodb/
ls -l /var/lib/mongo/
ls -l /tmp/*.sock

id

rm -rf /tmp/mongodb-27017.sock

systemctl start mongod

mongosh

test> use admin
admin> db.createUser(
      {
          user: "myUserAdmin",
          pwd: passwordPrompt(),
          roles: [
              { role: "userAdminAnyDatabase", db: "admin" },
              { role: "readWriteAnyDatabase", db: "admin" }
          ]
        }
    )

sudo vim /etc/mongod.conf
sudo systemctl restart mongod

mongosh --port 27017  --authenticationDatabase "admin"  -u "myUserAdmin" -p

test> use book
switched to db book
book> db.chinese.insertOne({title:"语文"})

test> use admin
switched to db admin
admin> db.auth("myUserAdmin","123456")
{ ok: 1 }
admin> use book
switched to db book
book> db.createUser({user:"zhangsan",pwd:"123456",roles:[{role:"readWrite",db:"book"}]})
{ ok: 1 }
book> db.auth("zhangsan","123456")
{ ok: 1 }
book> show collections
  1. Docker 运行 MongoDB

方式一:另启一个容器去连接(PS:相当于远程连接)

docker run -d --network my-network --name my-mongo \
    -e MONGO_INITDB_ROOT_USERNAME=mongoroot \
    -e MONGO_INITDB_ROOT_PASSWORD=123456 \
    -v /data/mongo/db:/data/db \
    -p 27017:27017 \
    mongo

docker run -it --rm --network my-network mongo \
    mongosh --host my-mongo \
        -u mongoroot \
        -p 123456 \
        --authenticationDatabase admin

Spring Boot MongoDB

方式二:从运行MongoDB实例的容器内部进行连接(PS:相当于本地连接)

docker run -d --network my-network --name my-mongo \
    -e MONGO_INITDB_ROOT_USERNAME=mongoroot \
    -e MONGO_INITDB_ROOT_PASSWORD=123456 \
    -v /data/mongo/db:/data/db \
    -p 27017:27017 \
    mongo

docker exec -it my-mongo mongosh

Spring Boot MongoDB

备忘录

docker run -d --network my-network --name my-mongo \
    -e MONGO_INITDB_ROOT_USERNAME=mongoroot \
    -e MONGO_INITDB_ROOT_PASSWORD=123456 \
    -v /data/mongo/db:/data/db \
    -p 27017:27017 \
    mongo

docker run -it --rm --network my-network mongo \
    mongosh --host my-mongo \
        -u mongoroot \
        -p 123456 \
        --authenticationDatabase admin

docker exec -it my-mongo mongosh

docker run -it --rm mongo mongosh --help
docker exec -it some-mongo bash
docker logs -f some-mongo

docker exec -it my-mongo mongosh
use admin
db.auth("myUserAdmin","123456")
db.createUser({user:"hello",pwd:"world",roles:[{role:"readWrite",db:"movie"}]})

Spring Boot MongoDB

补充

不建议用root用户来运行MongoDB

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

Spring Boot MongoDB
  1. Spring Boot 集成 MongoDB

maven依赖

<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-data-mongodb</artifactid>
</dependency>

完整的pom.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>2.6.2</version>
        <relativepath> <!-- lookup parent from repository -->
    </relativepath></parent>
    <groupid>com.cjs.example</groupid>
    <artifactid>demo-mongodb</artifactid>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo-mongodb</name>

    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-data-mongodb</artifactid>
        </dependency>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-web</artifactid>
        </dependency>

        <dependency>
            <groupid>org.projectlombok</groupid>
            <artifactid>lombok</artifactid>
            <optional>true</optional>
        </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>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupid>org.projectlombok</groupid>
                            <artifactid>lombok</artifactid>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

application.yml

spring:
  data:
    mongodb:
      host: 192.168.28.32
      port: 27017
      database: movie
      username: hello
      password: world
     uri: mongodb://192.168.28.32:27017

连接字符串格式,参见 https://docs.mongodb.com/manual/reference/connection-string/

方式一:MongoTemplate

首先,定义一个实体类

package com.cjs.example.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

import java.io.Serializable;
import java.util.List;

/**
 * @Author ChengJianSheng
 * @Date 2022/1/12
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "film")
public class Film implements Serializable {

    @Id
    private String id;

    private String name;

    private List<string> category;
}</string>

然后,利用MongoTemplate进行操作

package com.cjs.example;

import com.cjs.example.domain.Film;
import com.cjs.example.repository.FilmRepository;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;

@SpringBootTest
class DemoMongodbApplicationTests {

    @Resource
    private MongoTemplate mongoTemplate;

    /**
     * movie> db.createUser({user:"hello",pwd:"world",roles:["readWrite"]})
     */
    @Test
    void contextLoads() {
        Film film = new Film();
        film.setName("&#x6211;&#x548C;&#x6211;&#x7684;&#x7236;&#x8F88;");
        film.setCategory(Arrays.asList("&#x5267;&#x60C5;"));
        mongoTemplate.insert(film);
    }

    @Test
    void testQuery() {
        List<film> filmList = mongoTemplate.findAll(Film.class);
        System.out.println(filmList);

        Query query = new Query();
        query.addCriteria(Criteria.where("name").is("&#x6211;&#x548C;&#x6211;&#x7684;&#x7236;&#x8F88;").and("category").in("&#x7231;&#x60C5;","&#x6218;&#x4E89;","&#x5267;&#x60C5;"));
        Film film = mongoTemplate.findOne(query, Film.class);
        System.out.println(film);
    }

    @Test
    void testSave() {
        Film film = new Film();
        film.setId("asdfgh");
        film.setName("&#x957F;&#x6D25;&#x6E56;");
        film.setCategory(Arrays.asList("&#x6218;&#x4E89;","&#x5386;&#x53F2;"));
        mongoTemplate.save(film);
    }

}
</film>

方式二:Spring Data MongoDB Repositories

定义一个Repository

package com.cjs.example.repository;

import com.cjs.example.domain.Film;
import org.springframework.data.repository.CrudRepository;

import java.util.List;

/**
 * @Author ChengJianSheng
 * @Date 2022/1/12
 */
public interface FilmRepository extends CrudRepository<film, string> {

    List<film> findByName(String name);
}</film></film,>

完整测试代码如下:

package com.cjs.example;

import com.cjs.example.domain.Film;
import com.cjs.example.repository.FilmRepository;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;

@SpringBootTest
class DemoMongodbApplicationTests {

    @Resource
    private MongoTemplate mongoTemplate;

    @Resource
    private FilmRepository filmRepository;

    /**
     * movie> db.createUser({user:"hello",pwd:"world",roles:["readWrite"]})
     */
    @Test
    void contextLoads() {
        Film film = new Film();
        film.setName("&#x6211;&#x548C;&#x6211;&#x7684;&#x7236;&#x8F88;");
        film.setCategory(Arrays.asList("&#x5267;&#x60C5;"));
        mongoTemplate.insert(film);
    }

    @Test
    void testQuery() {
        List<film> filmList = mongoTemplate.findAll(Film.class);
        System.out.println(filmList);

        Query query = new Query();
        query.addCriteria(Criteria.where("name").is("&#x6211;&#x548C;&#x6211;&#x7684;&#x7236;&#x8F88;").and("category").in("&#x7231;&#x60C5;","&#x6218;&#x4E89;","&#x5267;&#x60C5;"));
        Film film = mongoTemplate.findOne(query, Film.class);
        System.out.println(film);
    }

    @Test
    void testSave() {
        Film film = new Film();
        film.setId("asdfgh");
        film.setName("&#x957F;&#x6D25;&#x6E56;");
        film.setCategory(Arrays.asList("&#x6218;&#x4E89;","&#x5386;&#x53F2;"));
        mongoTemplate.save(film);
    }

    @Test
    void testSaveByRepository() {
        filmRepository.save(new Film("1234", "&#x706B;&#x5F71;&#x5FCD;&#x8005;", Arrays.asList("&#x52A8;&#x753B;","&#x559C;&#x5267;","&#x52A8;&#x4F5C;","&#x5192;&#x9669;")));
    }

    @Test
    void testQueryByRepository() {
        Film film = filmRepository.findById("1234").orElse(null);
        System.out.println(film);
        film = filmRepository.findByName("&#x706B;&#x5F71;&#x5FCD;&#x8005;").get(0);
        System.out.println(film);

        filmRepository.findAll().forEach(System.out::println);
    }
}
</film>

Spring Boot MongoDB

工程结构如下:

Spring Boot MongoDB

Spring Boot MongoDB

Original: https://www.cnblogs.com/cjsblog/p/15795184.html
Author: 废物大师兄
Title: Spring Boot MongoDB

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612278/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SQL的语法

    创建: create database [if not exists] 数据库名称 [default charset 字符集] [collate 排序规则]; (PS:方括号(&#…

    数据库 2023年5月24日
    056
  • 面试记录

    JVM线程属于用户态还是内核态 当进程运行在ring3级别时为用户态,ring0级别时为内核态 有些操作需要有内核权限才能进行,那么有三种由用户态切换到内核态的情况: 系统调用:操…

    数据库 2023年6月16日
    097
  • MYSQL(基本篇)——一篇文章带你走进MYSQL的奇妙世界

    MYSQL算是我们程序员必不可少的一份求职工具了 无论在什么岗位,我们都可以看到应聘要求上所书写的”精通MYSQL等数据库及优化” 那么我们今天就先来了解一…

    数据库 2023年5月24日
    087
  • PHP设计模式—享元模式

    定义: 享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。 结构: Flyweight:享元抽象类,所有具体享元类的接口,通过这个接口,Flyweight 可…

    数据库 2023年6月14日
    077
  • 云数据库技术|“重磅升级”后再测 TDSQL-C

    标题 1.摘要 前段时间,测试了国内主要云原生数据库 PolarDB、TDSQL-C、GaussDB 的性能,参考:《再测云原生数据库性能》。在上次测试结果中,由于地域版本差异,腾…

    数据库 2023年6月11日
    076
  • fiddler的mock数据与二次开发示例

    fiddler的使用记录 fiddler了解 上官网下载工具,然后安装使用,https://www.telerik.com/fiddler,如果对该工具不熟悉,还有直白的教程,看过…

    数据库 2023年6月6日
    0108
  • Harsh =哈希 =散列

    key-hash-%-index Harsh =哈希 =散列 HarshCode=哈希码=哈希代码=散列码=散列值 哈希函数=散列函数=哈希算法=Harsh Algorithm 散…

    数据库 2023年6月14日
    071
  • VScode 添加jvm 启动参数 VScode 添加main方法参数

    问题场景. 本地环境使用的是 jdk 17 我需要在vscode 上运行一个jdk1.8 的项目 结果报错 : module java.base does not “o…

    数据库 2023年6月14日
    081
  • MySQL45讲-2-一条SQL更新语句是如何执行的?

    前面我们了解了SQL查询语句是如何执行的,一条SQL查询语句的过程需要经过连接器、分析器、优化器、执行器等功能模块,最终到达存储引擎。 在MySQL中,可以恢复到半个月内的任何一个…

    数据库 2023年5月24日
    088
  • JUC学习笔记(八)

    JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.htmlJUC学习笔记(二)https://www.cnblogs.com/lm…

    数据库 2023年6月6日
    085
  • SQL中的排座位问题

    表: Seat +————-+———————+|…

    数据库 2023年6月14日
    087
  • 链表问题一些常用的套路与方法

    概述 链表问题应该是数据结构中比较基础的一类问题,但同时也是在面试中常考的一类问题。但是围绕链表问题的一些基本方法或者处理思想,也无外乎那几类,因此本文尝试对链表常用的一些方法或者…

    数据库 2023年6月11日
    072
  • go的调度

    操作系统根据资源访问权限的不同,体系架构可以分为用户空间和内核空间;内核空间主要操作访问CPU资源,IO资源,内存资源等硬件资源,为应用程序提供最基本的基础资源;用户空间是上层应用…

    数据库 2023年6月9日
    079
  • Mysql的读写分离中间件该怎么写?听我来说。

    网上有很多读写分离的中间件,像proxy,mycat等等,由于本人比较懒,懒得去读各种开源的东西,还是想造轮子来得快。 1、了解mysql通信协议,其中有分4.1之前和4.1版本的…

    数据库 2023年6月14日
    0102
  • LeetCode 27. 移除元素

    给你一个数组nums和一个值val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用O(1)额外空间并 原地 修改输入数…

    数据库 2023年6月11日
    074
  • zabbix

    1. zabbix介绍 2. zabbix特点 3. zabbix配置文件 4. 部署zabbix zabbix介绍 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监…

    数据库 2023年6月14日
    071
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球