Linux操作系统中MongoDB

news2024/12/28 19:26:04

1、什么是MongoDB

1、非关系型数据库

NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题。

2、非关系型数据库分类

键值(Key-Value)存储数据库

类似于HashMap的方式,例如redis

列存储数据库

以列为概念的,用于处理大数据量的数据,例如HBase

文档型数据库

是应用比较广泛的,以文档形式处理数据的,文档不是硬盘上直接对应的文件,是个概念,例如MongoDB

图形(Graph)数据库

Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。

3、MongoDB?bson格式什么样?

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

JSON的BSON格式‌是一种二进制表示的数据交换格式,它是“Binary JSON”的缩写。

2、MongoDB的优势

  • 简单性,应用起来比较容易,易上手

  • 扩展性,指的是mango本身的拓展,比如说可以做分片模式集群等等

  • 高性能,在Wiretiger存储引擎的加持下,数据的读写可以做到更大的吞吐量

  • 高可用,自身出现故障的情况很少,也可以通过集群的方式再提供高可用性,还支持故障转移

  • 存文件,mongo天然支持文件存储,以桶的形式,用的对象是GridFS,文件会被切割成多个16M大小存储

3、MongoDB应用场景

它的应用场景非常广泛,存储数据、读写网站数据、文件存储、日志存储、缓存等。

从数据角度说,mongo关注是未来数据量。

从需求角度说,mongo关注是未来的拓展和维护。

4、术语

mongomysql
database 数据库database 数据库
collection 集合table 表
field 字段column 列
document 文件row 行
primary key 主键primary key 主键
index 索引index 索引
multi-document transactions 事务transactions 事务

mongo从5版本对事务的支持更好,以后工作用的一定是5版本及以上的。

我们学习用4版本,是因为很多电脑安装不了5版本,受硬件影响。4版本和5版本在操作上没有什么大区别,学习不影响。

5、操作

1、安装MongoDB

基于docker的安装,版本号4.4.18

1、查询镜像文件【不操作】

docker search mongo

2、拉取镜像文件

docker pull mongo:4.4.18 

3、创建数据挂载目录

mkdir -p /usr/local/docker/mongodb/data

cd /usr/local/docker/mongodb

chmod 777 data

4、启动容器

docker run -d \
  --name mongodb \
  --privileged \
  -p 27017:27017 \
  -v /usr/local/docker/mongodb/data:/data/db \
  -e MONGO_INITDB_ROOT_USERNAME=root \
  -e MONGO_INITDB_ROOT_PASSWORD=123456 \
  mongo:4.4.18 mongod --auth

--privileged:以真正的有权限方式启动

MONGO_INITDB_ROOT_USERNAME:设置账户

MONGO_INITDB_ROOT_PASSWORD:设置密码

2、验证安装成功

1、命令及说明

# 1.进入容器
docker exec -it mongodb /bin/bash
# 2.查看版本
mongo --version
# 3.以root用户登录mongo,-p是密码,--port是端口号,--authenticationDatabase是验证权限的数据库
mongo --port 27017 -u "root" -p "123456" --authenticationDatabase "admin"  
# 4.展示所有的数据库
show dbs
# 5.切换到dz14b数据库
use dz14b
# 6.创建一个用户,用户名是user01,密码是123456,角色是读写角色,作用在dz14b数据库上
db.createUser({user:"user01", pwd:"123456",roles: [{role:"readWrite", db:"dz14b"}]})
# 7.查看所有的用户数据
show users
# 8.退出mongodb数据库
exit
# 9.退出mongodb容器
exit
# 10.再次进入容器,以mongo命令进入,进入到dz14b数据库中
docker exec -it mongodb mongo dz14b
# 11.查看当前在那个数据库
db
# 12.查看数据库,发现没有其他数据库,我们已经再dz14b了,所以查询不到其他数据库
show dbs
# 13.授权
db.auth("user01", "123456")
# 14.查看数据库,发现没有,授权影响不到用户的作用范围
show dbs
# 15.因为没有权限报错了
show users
# 16.向dz(dz自定义的名字)集合插入了一个文档,数据是inser方法的参数。对照sql理解:向dz表插入一条记录
db.dz.insert({name:"zhangsan"})
# 17.查询dz集合下所有的数据
db.dz.find()

【第1,2,3步骤】

【第4-9步骤】

【第10-17步骤】

3、删除用户【不操作】

1、命令及说明

# 进入docker容器
docker exec -it mongodb /bin/bash
# 以root用户登录mongo,-p是密码,--port是端口号,--authenticationDatabase是验证权限的数据库
mongo --port 27017 -u "root" -p "123456" --authenticationDatabase "admin"  
# 切换到dz12b数据库
use dz12b
# 查看所有的用户数据
show users
# 切换到admin数据库
user admin
# 授权
db.auth("root", "123456")
# 删除用户,用户信息再system.users下,remove是一个命令
db.system.users.remove({user:"user01"})
# 重新进入mongo,验证删除成功
exit
mongo --port 27017 -u "root" -p "123456" --authenticationDatabase "admin"  
use dz7b
show users
 

4、Navicat连接

5、insert

db.dz.insert({name:"lisi", age:20}); db.dz.save({name:"wangwu", age:25}); db.dz.save({name:"zhangsan", age:25}); db.dz.insert({_id:ObjectId("63e4c8bdd20e7cc75a36a700"),name:"zhangsan1",age:20}) db.dz.save({_id:ObjectId("63e4c8bdd20e7cc75a36a700"),name:"zhangsan1",age:20})

insert和save的区别:

如果设置了id字段,id不重复二者没有区别,都是新增一条数据,如果id重复,insert会报错,save执行修改操作。

【执行insert语句同时 创建集合“表”】

6、find

操作符格式实例与 RDBMS where 语句比较
等于(=){<key> : {<value>}}db.test.find( {price : 24} )where price = 24
大于(>){<key> : {$gt : <value>}}db.test.find( {price : {$gt : 24}} )where price > 24
小于(<){<key> : {$lt : <value>}}db.test.find( {price : {$lt : 24}} )where price < 24
大于等于(>=){<key> : {$gte : <value>}}db.test.find( {price : {$gte : 24}} )where price >= 24
小于等于(<=){<key> : {$lte : <value>}}db.test.find( {price : {$lte : 24}} )where price <= 24
不等于(!=){<key> : {$ne : <value>}}db.test.find( {price : {$ne : 24}} )where price != 24
与(and){key01 : value01, key02 : value02, ...}db.test.find( {name : "《MongoDB 入门教程》", price : 24} )where name = "《MongoDB 入门教程》" and price = 24
或(or){$or : [{key01 : value01}, {key02 : value02}, ...]}db.test.find( {$or:[{name : "《MongoDB 入门教程》"},{price : 24}]} )where name = "《MongoDB 入门教程》" or price = 24
db.dz.find({age : 25} )
db.dz.find({age : {$gt : 20}})
db.dz.find({age:{$gt:20},name:'zhangsan'})

7、delete

db.dz.deleteOne({age:20})

db.dz.deleteMany({age:20})

deleteOne是删除按照条件查询到的第一条数据

deleteMany是删除所有符合条件的记录

8、update

db.dz.updateOne(
    {age:25},
    {$set:{age:20}}
)

db.dz.updateMany(
    {age:25},
    {$set:{age:20}}
)

updateOne是修改按照条件查询到的第一条数据

updateMany是修改所有符合条件的记录

9、其他操作【了解】

# 查看所有数据库
show dbs
# 应用到指定数据库
use databasename
# 查看数据库下的集合
show collections
# 创建集合
db.createCollection("test_collection")
# 删除集合,test_collection是集合的名字
db.test_collection.drop()

6、SpringBoot整合

1.添加依赖

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.13</version>
    </parent>
​
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
        <jwt.version>0.7.0</jwt.version>
        <fastjson.version>1.2.60</fastjson.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
    </dependencies>
​
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>

2.添加配置

spring:
  data:
    mongodb:
      username: user01
      password: '123456'
      port: 27017
      host: 192.168.1.101
      database: dz14b

mongodb配置有两种方式,如果第一种不生效,可以用第二种尝试一下

spring:
  data:
    mongodb:
      uri: mongodb://user01:123456@192.168.1.101:27017/dz12b

3.编写Entry

import lombok.Data;
import org.springframework.data.annotation.Id;
​
@Data
public class User {
​
    @Id
    private String id;
    private String name;
    private String password;
}

4.编写DAO

import org.jsoft.demo.vo.User;
import java.util.List;
​
public interface IUserDao {
​
    /**
     * 新增
     *
     * @param user 目标对象
     */
    void insert(User user);
​
    /**
     * 删除
     *
     * @param id 对象主键
     */
    void delete(String id);
​
    /**
     * 修改
     *
     * @param user 目标对象
     */
    void update(User user);
​
    /**
     * 通过主键查询
     *
     * @param id 主键
     * @return user对象
     */
    User findById(String id);
​
    /**
     * 查询
     *
     * @param user 条件对象
     * @return user集合
     */
    List<User> query(User user);
​
}
​

5.编写DAOImpl

MongoTemplate常用方法:

 mongoTemplate.insert(user);  //添加user对象
 mongoTemplate.findById(id, User.class);  //根据主键id,查询单个user对象。
 mongoTemplate.remove(user);  //删除指定user对象
 mongoTemplate.remove(条件对象Query, User.class);   // 删除符合条件的user对象
 mongoTemplate.updateMulti(条件对象query, 修改对象update, User.class);  //修改符合条件的user对象
 mongoTemplate.find(条件对象query, User.class);  //查询符合条件的user对象

条件对象Query常用方法:

#将构建好的查询条件添加到查询对象中
query.addCriteria(Criteria.where("_id").is(id));
​

Criteria常用方法:

#用于定义查询条件的接口,它提供了一系列的方法来构建复杂的查询条件。
Criteria.where("_id").is(id);
​

修改对象Update常用方法:

update.set("password", user.getPassword());

测试代码:

import org.jsoft.demo.dao.IUserDao;
import org.jsoft.demo.vo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;
​
import java.util.List;
​
​
@Repository
public class UserDaoImpl implements IUserDao {
​
    @Autowired
    private MongoTemplate mongoTemplate;
​
    @Override
    public void insert(User user) {
        mongoTemplate.insert(user);
    }
​
    @Override
    public User findById(String id) {
        return mongoTemplate.findById(id, User.class);
    }
​
    //    @Override
    public void delete1(String id) {
        User user = findById(id);
        if (user != null) {
            mongoTemplate.remove(user);
        } else {
            System.out.println("没有找到要删除的数据!");
        }
    }
​
    @Override
    public void delete(String id) {
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(id));
        mongoTemplate.remove(query, User.class);
    }
​
    @Override
    public void update(User user) {
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(user.getId()));
        Update update = new Update();
        update.set("name", user.getName());
        update.set("password", user.getPassword());
        mongoTemplate.updateMulti(query, update, User.class);
    }
​
    @Override
    public List<User> query(User user) {
        Query query = new Query();
        if(user.getId() != null){
            query.addCriteria(Criteria.where("_id").is(user.getId()));
        }
        if(user.getName() != null){
            query.addCriteria(Criteria.where("name").is(user.getName()));
        }
        if(user.getPassword() != null){
            query.addCriteria(Criteria.where("password").is(user.getPassword()));
        }
        return mongoTemplate.find(query, User.class);
    }
}

6.编写测试类Test

import lombok.extern.slf4j.Slf4j;
import org.jsoft.demo.dao.IUserDao;
import org.jsoft.demo.vo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
​
​
@Slf4j
@SpringBootTest(classes = DemoHelloworldApplication.class)
@SuppressWarnings("all")
public class MongoDbTest {
​
    @Autowired
    private IUserDao userDao;
​
    @Test
    public void testInsert() {
        User user = new User();
        user.setPassword("123");
        user.setName("zhangsan");
        userDao.insert(user);
    }
​
    @Test
    public void testFindById() {
        User byId = userDao.findById("661794efd775ee4bd7a6d069");
        System.out.println(byId);
    }
​
    @Test
    public void testDelete() {
        userDao.delete("6617970547fbc57ef66a962f");
    }
​
    @Test
    public void testUpdate() {
        User user = new User();
        user.setId("661797ee479a0c02f0dd9212");
        user.setPassword("123456");
        user.setName("lisi");
        userDao.update(user);
    }
​
    @Test
    public void testQuery() {
        User user = new User();
//        user.setId("661797ee479a0c02f0dd9212");
        user.setPassword("123");
//        user.setName("lisi");
        System.out.println(userDao.query(user));
    }
​
}

7.编写启动类

package com.jr;
​
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
​
@SpringBootApplication
public class SpringBootMain {
​
    public static void main(String[] args) {
        SpringApplication.run(SpringBootMain.class);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2172565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

改变安全策略的五大实践

随着网络威胁形势的加剧&#xff0c;网络安全计划必须不断发展以保护组织的使命。 为了管理这种持续的网络安全发展&#xff0c;应遵循五项关键的安全计划变更管理实践&#xff1a; 1. 识别并吸引受安全风险影响的业务利益相关者 随着新的网络安全风险被发现&#xff0c;受影…

HEITRONICS TC13红外辐射高温计CT13 INFRARED RADIATION PYROMETER CT13

HEITRONICS TC13红外辐射高温计CT13 INFRARED RADIATION PYROMETER CT13

山海优选电商平台卷轴模式订单系统核心架构解析

山海优选卷轴模式的订单核心源码是涉及订单处理、支付、搜索、状态管理等关键功能的代码部分。由于直接提供完整的源代码可能涉及版权和隐私保护问题&#xff0c;我将基于参考文章中的信息&#xff0c;概述该模式订单核心源码的主要结构和功能点。 一、订单核心源码概述 在山海…

IDEA2020运行项目时不从配置的maven仓库找jar包,从C盘默认路径下找jar包

目录 问题描述&#xff1a; 解决方案&#xff1a; 问题描述&#xff1a; 使用IDEA2020做java开发&#xff0c;idea的设置中maven仓库地址配在D盘&#xff0c; maven的配置文件setting.xml中的仓库也已经确认配置到D盘&#xff0c; 项目根据pom文件自动下载jar包时也会下载到…

【Python快速学习笔记01】下载解释器/环境变量配置/PyCharm下载/第一个代码

目录 1.下载python解释器 2.第一个python程序 3.配置解释器环境变量 4.下载开发工具 PyCharm 4.通过PyCharm编写第一个python程序 1.下载python解释器 官网下载&#xff0c;但是下载太慢了&#xff0c;所以直接百度搜了下载了个 Welcome to Python.org 1.官网下载 2.直…

深度伪造语音检测(Deepfake Speech Detection, DSD)全面概述

近期&#xff0c;深度学习技术和神经网络在生成型人工智能领域已取得重大突破。如今&#xff0c;关键的通信媒介&#xff0c;如音频、图像、视频和文本&#xff0c;均能实现自动生成&#xff0c;并广泛应用于诸多领域&#xff0c;包括聊天机器人系统&#xff08;如ChatGPT&…

大数据新视界 --大数据大厂之数据压缩算法比较与应用:节省存储空间

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

基于Python实现的国庆节庆祝小程序

祖国母亲即将迎来75周年华诞&#xff0c;在这个特殊的日子里&#xff0c;我们可以用编程的方式来表达对祖国的祝福。本文将使用Python编写一个简单的国庆节庆祝小程序&#xff0c;通过一些编程技巧和设计为国庆节增添一些程序员的特色。 ⭕️庆祝国庆 ⭐️ 程序设计思路&#x…

Netty 与 WebSocket之间的关系

WebSocketProtocolHandler 和 Netty 在处理 WebSocket 连接时扮演不同的角色&#xff0c;但它们通常是一起使用的&#xff0c;尤其是在基于 Netty 的项目中。为了更好地理解它们之间的区别&#xff0c;我们首先需要了解 WebSocket 和 Netty 的基本概念。 WebSocket WebSocket…

超好用的可视化工具!一键生成影响因素森林图,文章增色好帮手!

森林图目前在相关文献中可以说是非常常见了&#xff0c;不只是亚组分析中&#xff0c;普通的回归分析结果也可以用森林图进行可视化展示&#xff0c;不仅可以帮助我们更好地理解不同变量间的一致性和差异性&#xff0c;新颖的图片还能为文章增色不少。 当下主流绘制森林图的方式…

linux蓝屏重启解决方法汇总

前言 linux系统蓝屏&#xff08;Blue Screen Of Death&#xff09;是Linux系统用户遇到最严重的故障&#xff0c;任何新手都无法直接解决它。在遇到蓝屏时&#xff0c;最好的解决方案是联系Linux专业供应商或Linux专业支持工程师&#xff0c;因为他们有系统的协议和经验来解决…

手机如何五开玩梦幻西游端游?用GameViewer远程手机免费畅玩梦幻西游

用手机就能免费玩梦幻西游端游&#xff0c;还可以随时查看挂机进度&#xff01; 想要实现这一点&#xff0c;就用网易GameViewer远程&#xff0c;而且不光手机可以玩梦幻西游端游&#xff0c;平板也能免费玩&#xff0c;并为你实现五开玩梦幻西游端游。 那么&#xff0c;通过Ga…

事后被动处置向事前主动预警转变的智慧工业开源了

智慧工业视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用户只需在界面上…

【逐梦旅程】Windows游戏开发笔记

前言 伴随着最近黑神话悟空大火&#xff0c;游戏开发也引起了我的关注。我相信每一个程序员都有一个开发游戏的梦&#xff0c;遗憾的是我的职业路径似乎与这个梦想越来越远了。但是也没关系&#xff0c;我收藏过一本游戏开发的书籍&#xff0c;正好趁现在工作不忙&#xff0c;…

C# 相等性检测方法差异分析(==,Equals,ReferenceEquals)

先给结论&#xff1a; 对于每种类型创建2个一样的数据&#xff0c;比较结果如下表所示&#xff1a; 数据类型EqualsReferenceEqualsint(值类型)√√引用类型引用类型&#xff08;带override&#xff09;以operator 实现为准以Equals覆写为准struct必须实现操作符√struct&…

【BurpSuite】访问控制漏洞和权限提升 | Access control vulnerabilities (3-6)

&#x1f3d8;️个人主页&#xff1a; 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞&#x1f44d;收藏&#x1f497;支持一下哦 【BurpSuite】访问控制漏洞和权限提升 | Access control vulnerabilities (3-6&#xff09; 实验三 Lab: User role controlled b…

【高频SQL基础50题】6-10

目录 1.上级经理已离职的公司员工 2.修复表中的名字 3. 寻找用户推荐人 4.产品销售分析 I 5.平均售价 1.上级经理已离职的公司员工 子查询。 先根据薪水大小查询&#xff0c;再根据manager_id查询该员工是否存在&#xff0c;最后做排序。 # Write your MySQL query st…

ValueError: Out of range float values are not JSON compliant

可能原因一 可能原因二 数据里面有NaN

C++八股进阶

之前那个只是总结了一下常考点&#xff0c;这个是纯手打记笔记加深理解 这里写目录标题 C的四种智能指针为什么要使用智能指针&#xff1f;四种智能指针&#xff1a; C中的内存分配情况C中的指针参数传递和引用参数传递C 中 const 和 static 关键字&#xff08;定义&#xff0…

Linux云计算 |【第四阶段】PROJECT2-DAY2

综合项目内容&#xff1a; 升级网站运行平台、部署Redis内存存储服务集群、数据迁移、部署PXCMySQL实现强同步、部署LB和HA集群 一、项目拓扑结构 PROJECT2-DAY1回顾&#xff1a; 服务架构缺点分析&#xff1a; ① 数据存储结构存在单点故障&#xff08;需增调度器&#xff0…