MongoDB学习

这篇具有很好参考价值的文章主要介绍了MongoDB学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

MongoDB学习


0 MongoDB和Redis区别

Redis和MongoDB是两种不同的数据库类型,它们在设计目标、数据模型、性能和使用场景上有很大的差异。

Redis是一种基于内存的键值存储数据库,支持高性能读写和支持数据持久化。它通常用于缓存、消息队列、实时分析等应用场景。

MongoDB是一种文档型数据库,支持高性能读写和分布式部署。它通常用于大规模数据存储、查询和分析。

总的来说,Redis更适合高性能场景,MongoDB更适合大规模数据存储和分析。

1 简介MongoDB

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统;在高负载的情况下,添加更多的节点,可以保证服务器性能

可以做缓存,非常适合集群伸缩扩展,适合应对海量数据的读写
由于其文档形式,非常适合存取JSON数据
可以执行简单的查询,但对连表查询不支持

SQL术语/概念	MongoDB术语/概念	解释/说明
database	database	数据库
table	    collection	数据库表/集合
row	        document	数据记录行/文档
column	    field	数据字段/域
index	    index	索引
table       joins	 	表连接,MongoDB不支持
primary key	primary key	主键,MongoDB自动将_id字段设置为主键

MongoDB学习

2 MongoDB的安装(需要使用Docker)

#拉取镜像 
docker pull mongo:latest

#创建和启动容器 
docker run -d --restart=always -p 27017:27017 --name mymongo -v /data/db:/data/db -d mongo

#进入容器 
docker exec -it mymongo /bin/bash 

#使用MongoDB客户端进行操作 
mongo 

> show dbs #查询所有的数据库 
admin 0.000GB 
config 0.000GB 
local 0.000GB 

3 MongoDB 概念解析

下表将帮助您更容易理解Mongo中的一些概念:

SQL术语/概念	MongoDB术语/概念	解释/说明
database	database	数据库
table	    collection	数据库表/集合
row	        document	数据记录行/文档
column	    field	数据字段/域
index	    index	索引
table       joins	 	表连接,MongoDB不支持
primary key	primary key	主键,MongoDB自动将_id字段设置为主键

通过下图实例,我们也可以更直观的的了解Mongo中的一些概念:
MongoDB学习

3.1 数据库

一个mongodb中可以建立多个数据库

常用操作:
1、 Help查看命令提示 
db.help();
2、 切换/创建数据库
use test
如果数据库不存在,则创建数据库,否则切换到指定数据库
3、 查询所有数据库 
show dbs;
4、 删除当前使用数据库 
db.dropDatabase();
5、 查看当前使用的数据库 
db.getName();
6、 显示当前db状态 
db.stats();
7、 当前db版本 
db.version();
8、 查看当前db的链接机器地址 
db.getMongo〇;

3 .2 文档

文档是一组键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
下表列出了 RDBMS 与 MongoDB 对应的术语:

RDBMS	MongoDB
数据库	数据库
表格   	集合
行	    文档
列	     字段
表联合	嵌入文档
主键	     主键 (MongoDB 提供了 key 为 _id )

需要注意的是:

1、文档中的键/值对是有序的。
2、文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
3、MongoDB区分类型和大小写。
4、MongoDB的文档不能有重复的键。
5、文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范:
1、键不能含有\0 (空字符)。这个字符用来表示键的结尾。
2、.和$有特别的意义,只有在特定环境下才能使用。
3、以下划线"_"开头的键是保留的(不是严格要求的)。

3.3 集合

集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。
集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

常用命令:
1、 创建一个集合(table)
db.createCollection( "collName");
2、 得到指定名称的集合(table )
db.getCollection("user");

3.4 MongoDB 数据类型

下表为MongoDB中常用的几种数据类型:

数据类型	描述
String	字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
Integer	整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
Boolean	布尔值。用于存储布尔值(真/假)。
Double	双精度浮点值。用于存储浮点值。
Min/Max keys	将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
Arrays	用于将数组或列表或多个值存储为一个键。
Timestamp	时间戳。记录文档修改或添加的具体时间。
Object	用于内嵌文档。
Null	用于创建空值。
Symbol	符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
Date	日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
Object ID	对象 ID。用于创建文档的 ID。
Binary Data	二进制数据。用于存储二进制数据。
Code	代码类型。用于在文档中存储 JavaScript 代码。
Regular expression	正则表达式类型。用于存储正则表达式。

3.5适用场景

适用场景
1、网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
2、缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由M ongo搭建的持久化缓存层可以避免下层的数据源过载。
3、大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵, 在此之前,很多时候程序员往往会选择传统的文件进行存储。
4、高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对Map Reduce弓摩的内置支持。
5、用于对象及 JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储 及查询。
不适用场合
1、高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
2、传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。

4 常用操作

4.1 INSERT

> db.User.save({name:'zhangsan',age:21,sex:true})
> db.User.find()
{"_id": Objectld("4f69e680c9106ee2ec95da66"), "name": "zhangsan", "age": 21,
"sex": true}

Objectld 是生成的 规则如下

_id组合
Objectld是、id”的默认类型。Objectld使用12字节的存储空间,每个字节二位十六进制数字, 是一个24位的字符串
 
1. 时间戳:时间不断变化的
2. 机器:主机的唯_标识码。通常是机器主机名的散列值,这样可以确保不同主机 
生成不同的Objectld ,不产生冲突。
3. PID:为了确保在同一台机器上并发的多个进程产生的Objectld是唯一的,
所以加上进程标识符(PID).
4. 计数器:前9个字节保证了同一秒钟不同机器不同进程产生的Objectld是唯一的。 
后3个字节就是一个自动增加的计数器,确保相同进程同一秒产生的Objectld也是 
不一样。同一秒最多允许每个进程拥有IS 777 2托个不同的Objectld。

4.2 Query

1、WHERE
# select * from User where name = 'zhangsan'
> db.User.find({name:"zhangsan"})

2、FIELDS
# select name, age from User where age = 21
> db.User.find({age:21}, {'name':1, 'age':1})

3、SORT
在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1-1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。
# select * from User order by age
> db.User.find().sort({age:1})

4、SUCE
在 MongoDB 中使用 limit()方法来读取指定数量的数据,skip()方法来跳过指定数量的数据
# select * from User skip 2 limit 3
> db.User.find().skip(0).limit(3)

5、IN
# select * from User where age in (21, 26, 32)
> db.User.find({age:{$in:[21,26,32]}})

6、COUNT
# select count(*) from User where age >20
> db.User.find({age:{$gt:20}}).count()

70R
# select * from User where age = 21 or age = 28
> db.User.find({$or:[{age:21}, {age:28}]})

4.3 Update

可直接用类似T-SQL条件表达式更新,或用SaveO更新从数据库返回到文档对象。

# update Userset age = 100, sex = 0 where name = 'user1'
> db.User.update({name:"zhangsan"}, {$set:{age:100, sex:0}})

Update()有几个参数需要注意。
db.collection.update(criteria, objNew, upsert, mult)
criteria:需要更新的条件表达式
objNew:更新表达式
upsert:如FI标记录不存在,是否插入新文档。 
multi:是否更新多个文档。

4.4 Remove

removeO用于删除单个或全部文档,删除后的文档无法恢复。

> db.User.remove(id)
//移除对应id的行
> db.User.remove({})
//移除所有

4.5 aggregate

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)

1.5.1 插入数据
>db.article.insert({
    title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: 'runoob.com',
   url: 'http://www.runoob.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
})
>db.article.insert({
   title: 'NoSQL Overview', 
   description: 'No sql database is very fast',
   by_user: 'runoob.com',
   url: 'http://www.runoob.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
})
>db.article.insert({
   title: 'Neo4j Overview', 
   description: 'Neo4j is no sql database',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
})
2.5.2 统计sum
现在我们通过以上集合计算每个作者所写的文章数
# select by_user, count(*) from article group by by_user
> db.article.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])

{
"result" : [
      {
"_id" : "runoob.com",
"num_tutorial" : 2
      },
      {
"_id" : "Neo4j",
"num_tutorial" : 1
      }
   ],
"ok" : 1
}

在上面的例子中,我们通过字段 by_user 字段对数据进行分组,并计算 by_user 字段相同值的总和。
2.5.3 常见的聚合表达式
表达式	描述	实例
$sum	计算总和。	db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avg	计算平均值	db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$min	获取集合中所有文档对应值得最小值。	db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max	获取集合中所有文档对应值得最大值。	db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$push	在结果文档中插入值到一个数组中。	db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet	在结果文档中插入值到一个数组中,但不创建副本。	db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first	根据资源文档的排序获取第一个文档数据。	db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last	根据资源文档的排序获取最后一个文档数据	db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

4.6 索引

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。

db.User.createIndex({“name”:1})

语法中 name值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可

5 整合Springboot使用

5.1 导入依赖

<dependencies>

<!--        mongoDB 无论是mongoDBTemplate 或者 mongoDBReposity 的方式都需要这个依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

<!--日期相关-->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10.1</version>
        </dependency>


<!--        web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

<!--        lombok-->
        <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>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

5.2 配置文件

我这里是properties文件 伙计们
用yaml随你们

# 应用服务 WEB 访问端口
server.port=8083

# /test是使用test数据库
spring.data.mongodb.uri=mongodb://139.xxxxxx.7:27017/test

5.3 配置实体类 实体类绑定表

因为数据库的绑定已经写在配置文件中

@Data
//其实这个是collection 也就是绑定表 和@TABLE一样   实体类和表绑定
@Document("TeaCher")
public class TeaCher {
    @Id
    private String id;
    private String name;
    private Integer age;
    private String email;
    private String createDate;
}

5.4 配置模板操作

两种方式(使用 mongoDBTemplate 或者 mongoDBReposity)
两种方式的操作语法不同
而且因为mongoDBReposity 先写个 接口
这个接口绑定了 实体类 实体类绑定了 表
因此通过mongoDBReposity 方式查 不需要说明是哪个表

5.4.1 如果使用mongoDBTemplate

直接@Autowired 注入模板使用即可

@SpringBootTest
class TestMongoDbApplicationTests {

    @Test
    void contextLoads() {
    }

    @Autowired
    private MongoTemplate mongoTemplate;

    //添加
    @Test
    public void createUser() {
        TeaCher user = new TeaCher();
        user.setAge(20);
        user.setName("test");
        user.setEmail("4932200@qq.com");
        TeaCher user1 = mongoTemplate.insert(user);
        System.out.println(user1);
    }


}

5.4.1 如果使用mongoDBReposity

首先配置一个接口

package com.example.testmongodb.demos.inter;

import com.example.testmongodb.demos.entity.TeaCher;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends MongoRepository<TeaCher, String> {

}

然后跟mongoDBTemplate 一样@Autowired注入使用

    @Autowired
    private UserRepository userRepository;



    //添加
    @Test
    public void Repository() {
        TeaCher user = new TeaCher();

        user.setAge(20);
        user.setName("张三");
        user.setEmail("3332200@qq.com");

        TeaCher user1 = userRepository.save(user);
        System.out.println(user1);

    }

这篇博客参考硅谷文档编写文章来源地址https://www.toymoban.com/news/detail-445310.html

到了这里,关于MongoDB学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java简化MongoDB编解码器的两种方法

    在与MongoDB进行数据交互时,有时候会遇到找不到类的编解码器(codec)的错误。为了解决这个问题,一种常见的方法是创建自定义编解码器来处理特定的类。然而,对于一些开发者来说,这样的方法可能过于繁琐。本文将介绍两种简化MongoDB编解码器的方法,让您能够更轻松地

    2024年02月15日
    浏览(45)
  • 【C++】C++学习前言

    C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(objectoriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。

    2024年03月12日
    浏览(56)
  • 课程学习前言

    app 抓包分析可以看到有签名有加固,毕竟需要 APK 去访问服务、获取数据,都需要 APK 有完整的信息,而这些信息、代码经过各种加密,还是放在 APK 里面。说白了,就是门锁紧了,钥匙藏在门口某个地方,也许就是地垫下面 逆向流程 拿到 App 应用的 apk ; 使用工具进行查壳

    2024年02月06日
    浏览(45)
  • Gowin FPGA学习记录——前言

            好久没有写博客了,想想是不是又该写点啥东西了么,准备写点国产FPGA的使用经历吧                  得益于目前国内的政策对国产化芯片扶持,越来越要求核心器件能够自主可控,因此作为核心芯片FPGA,国产FPGA的势头也发展很快。          现在FPGA的这

    2024年02月16日
    浏览(43)
  • 【自制C++深度学习框架】前言

    此GitHub项目是一个初学者的深度学习框架,使用C++编写,旨在为用户提供一种简单、易于理解的深度学习实现方式。以下是本项目的主要特点和功能: 计算图:使用计算图来描述深度学习模型的计算过程,利用计算图将神经网络的计算过程视为一个有向无环图。通过构建计算

    2024年02月07日
    浏览(43)
  • FPGA学习实践之旅——前言及目录

    很早就有在博客中记录技术细节,分享一些自己体会的想法,拖着拖着也就到了现在。毕业至今已经半年有余,随着项目越来越深入,感觉可以慢慢进行总结工作了。趁着2024伊始,就先开个头吧,这篇博客暂时作为汇总篇,记录在这几个月以及之后从FPGA初学者到也算有一定

    2024年02月03日
    浏览(58)
  • 大数据、人工智能、机器学习、深度学习关系联系前言

    1.大数据和人工智能关系 2.机器学习、深度学习、人工智能关系 3.监督学习、无监督学习、半监督学习、强化学习、迁移学习关系 4.机器学习具体内容 1.数据驱动的人工智能 :人工智能系统需要大量的数据来进行训练和学习。大数据提供了海量的信息,可以用于训练机器学习

    2024年02月12日
    浏览(62)
  • 【C++初阶(一)】学习前言以及命名空间

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++初阶之路⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习排序知识   🔝🔝 对于复杂的问题,规模较大的程序 需要高度的抽象和建模时 C语言不再适合应用于这种场景 于是在1982年 C++创始人 Bjarne Stroustrup 在C语言

    2024年02月11日
    浏览(53)
  • MongoDB与MySQL的区别???MongoDB的优势???

    MongoDB是一种开源的 文档型 数据库管理系统,它使用类似于JSON的BSON格式(Binary JSON)来存储数据。与传统关系型数据库不同,MongoDB 不使用表和行的结构 ,而是采用 集合 (Collection)( Mysql表 )和 文档 (Document)( MySql行 )的概念来组织数据。 区别: 数据模型 : MySQL :关系

    2024年04月25日
    浏览(40)
  • 【C++初阶(一)】学习前言 命名空间与IO流

    本专栏内容为:C++学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C++。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C++ 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 C++是基于C语言而产生的,它既可以进行C语言的

    2024年02月08日
    浏览(97)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包