MongoDB(一)基本概念和入门使用

一、简介

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB是一种非关系型数据库,被广泛用于大型数据存储和分布式系统的构建。MongoDB支持的数据模型比传统的关系型数据库更加灵活,支持动态查询和索引,也支持BSON格式的数据存储,这种格式可以支持读取和写入大量的数据。

MongoDB 是一个介于关系数据库非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。

在现代的计算系统上每天网络上都会产生庞大的数据量。

这些数据有很大一部分是由关系数据库管理系统(RDMBSs)来处理。 1970年 E.F.Codd’s提出的关系模型的论文 “A relational model of data for large shared data banks”,这使得数据建模和应用程序编程更加简单。

通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用的主导技术。

NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。

它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。

Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引

二、术语概念

主要是对比MySQL的相关术语

在这里插入图片描述
在这里插入图片描述
数据库(Database)
一个mongodb中可以建立多个数据库。
MongoDB的默认数据库为"db",该数据库存储在data目录中。
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。

集合(Collection)
集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。

集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
文档(Document)
文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

三、mongdb 优势以及应用场景

MongoDB的优势主要包括:

灵活的数据模型:MongoDB支持动态查询和索引,可以支持更大的数据集。
分布式扩展:MongoDB可以轻松地横向扩展,支持跨多个服务器分布数据,实现高可用性和负载均衡。
大规模数据存储:MongoDB支持海量数据存储,提供非常高的性能和可扩展性。
易于使用:MongoDB提供简单的命令行工具和可视化界面,支持多种编程语言,易于使用和自定义。

四、安装

docker pull mongo # 拉取镜像

mkdir mongo/data # 做数据卷挂载
# 运行的命令
docker run -d -p 27017:27017 --name mongodb  --restart=always -v /usr/local/docker-data/mongo/data:/data/db mongo:latest

使用Navicat连接(docker安装的默认是没有账号和密码的,没开启)
在这里插入图片描述

五、增删改查

  • 数据库
    创建/切换数据库

    use test; // 创建名称为test的数据库
    db // 查看当前使用的数据库
    

    删除数据库

    db.dropDatabase();// 删除当前数据库
    
  • 集合、文档

    创建集合

    db.createCollection(name, options) 
    db.createCollection("user_review"); // 创建集合
    

    mongdb 的文档语法是db.collection.xx方法,下面都是基于我的user_review集合的操作
    db.集合.方法,例如下面:

    db.collections.find(filter,options);
    db.collections.insertOne(filter,options);

    参数说明:
    name: 要创建的集合名称
    options: 可选参数, 指定有关内存大小及索引的选项
    在这里插入图片描述
    插入文档

    db.collections.insertMany(document, options) // 批量插入(一个或多个)
    db.collections.insertOne(document, options) // 单个插入
    db.collections.insert(document, options) // 批量插入(一个或多个),弃用,上面两个代替
    

    参数说明:

    ducoment: 要插入的文档对象(bson)
    options:可选参数,用于指定插入操作的选项,例如写入关注级别、写入超时时间等。

    示例:

    // 插入一个或多个数据,insert()相同,区别是inserMany单个的时候也需要是数组的形式
    db.user_review.insertMany(
    [
        {
            name: 'kiku1',
            description: '相互信任'
        },
        {
            name: 'kiku2',
            description: '各自努力'
        },
        {
            name: 'kiku3',
            description: '努力就会有回报'
        },
        {
            name: 'kiku4',
            description: '我很满意我自己'
        }
    ]
    );
    // 单个插入
    db.user_review.insertOne({
    	id: 123456,
      	name: 'Date'
    });
    

    更新

    db.collections.update(query, update, options) // 更新一个或多个(弃用)下面两个已经替代这个方法。
    db.collections.updateOne(filter, update, options) // 更新一个(有多个只会更新掉第一个满足的)
    db.collections.updateMany(filter, update, options) // 更新一个或多个
    // query 更新的条件,类似SQL的where部分
    // update 更新哪些字段的值,类似SQL中update的set部分
    // options(选项,可选):一个文档,可以包含一些更新的选项。
    // upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
    // multi(update方法支持) : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
    // writeConcern :可选,抛出异常的级别。
    

    示例:

    // 更新一条记录(id的值为123456的记录的name更改为new name)
    db.user_review.updateOne(
    {
        id: 123456
    },
    {
        $set: {
            name: "new name"
        }
    }
    );
    
    // 更新满足条件的所有记录(id列存在的记录的数据行的id都更新)
    db.user_review.updateMany(
    {
        id: {
            $exists: true
        },
        
    },
    {
        $set: {
            id: 19940618
        }
    }
    );
    

    相关的操作符参考代码与酒博主的这篇文章:MongoDB学习(七)$操作符表达式大全及实例

    查询

    db.collections.find(query, projection) // 查询满足的全部
    db.collections.findOne(query, projection) // 查询满足的第一个
    // query是条件,projection映射,默认是全部字段的返回,如select * 这种
    

    示例

    // 查询满足条件的所有数据
    db.user_review.find({
    name: {
        $regex: /kiku/
    }}, {
    _id: 1,name:1
    }); // 这里指定映射是只返回_id 和 name列的值
    // 查询满足的一条数据
    db.user_review.findOne({
    name: {
        $regex: /kiku/
    }
    });
    

    在MongoDB中,投影操作符具有以下可用的值:

    0:表示不返回该字段。需要注意的是,默认情况下会返回所有字段。如果您想排除某些字段,可以使用0来指示MongoDB不要返回这些字段。
    1:表示返回该字段。如果您只想返回某些字段,请使用1来指示MongoDB仅返回这些字段。
    当然,如果您需要更复杂的投影选项,MongoDB还提供了其他投影操作符,例如:

    $elemMatch:返回数组中满足指定条件的第一个元素。
    $meta:返回文本搜索相关度得分。
    $slice:返回数组中指定数量的元素。
    在使用投影操作符时,请查阅MongoDB官方文档以获取更多详细信息和示例。

    删除

    db.collections.remove(query, options) // 删除所有满足条件的记录(一条或多条),options参数可以指定删除一条还是多条(弃用方法,使用替代下面的方法)
    db.collections.deleteOne(filter, options) // 删除一条满足的记录
    db.collections.deleteMany(filter, options) // 删除所有满足条件的记录(一条或多条)
    

    参数说明:
    query/filter:筛选条件
    options:可选值

    示例

    // 删除name字段有d的第一个满足条件的数据  $regex: /d/ 是正则匹配
    db.user_review.deleteOne({
    name: {
        $regex: /d/
    }
    })
    
    // 删除所有满足的数据
    db.user_review.deleteMany({
    name: {
        $regex: /d/
    }
    })
    
  • 索引

    创建索引

    db.collections.createIndex(keys, options) // 创建单个
    db.collections.createIndexes(keyPatterns, options) // 批量创建
    

    keys:指定要创建索引的字段和排序方式。它是一个对象,其中键是字段名,值是排序方式(1 表示升序,-1表示降序)。例如,{ username: 1, rating: -1 } 表示在 user_review 集合中创建一个以 username 升序、rating 降序排列的复合索引。

    keyPatterns:指定要创建索引的字段和排序方式,可以是一个对象数组。每个对象分别表示一个字段的索引键模式。例如,[{ username: 1 }, { rating: -1 }] 表示在 user_review 集合中创建两个单字段索引,一个以 username 升序,一个以 rating 降序排列。

    options:指定索引的选项。它是一个包含各种选项的对象。常用选项包括:
    name:指定索引的名称。如果未提供名称,MongoDB 将自动生成一个唯一的索引名称。
    unique:设置为 true 以保证索引中的字段值唯一性。
    sparse:设置为 true 以忽略集合中没有被索引字段的文档,只索引存在的字段。
    background:设置为 true 以后台创建索引,不会阻塞其他操作。

    查看索引

    db.collections.getIndexes()
    

    删除索引

    db.collections.dropIndexes() // 删除全部
    db.collections.dropIndexe(index) // 删除指定索引 
    

六、对比其他数据库

MySQL、Elasticsearch(简称ES)、MongoDB和ClickHouse(简称CK)是四种不同类型的数据库,它们各自具有不同的特点、优势和适用场景。

  1. MySQL:

    • 类型:关系型数据库(RDBMS)。
    • 优势:
      • 成熟稳定:MySQL是一款经过长期发展和广泛应用的关系型数据库,被广泛认可并得到大量支持和社区贡献。
      • 数据一致性:MySQL提供了ACID事务支持,确保数据的一致性和可靠性。
      • SQL语言:MySQL使用SQL作为查询语言,具备强大的查询和数据操作能力。
    • 场景:
      • 适用于大多数传统的关系型数据库应用场景,如企业应用、电子商务、博客、论坛等。
  2. Elasticsearch (ES):

    • 类型:分布式搜索和分析引擎。
    • 优势:
      • 实时搜索和分析:ES专注于实时搜索和分析,具备高性能的全文搜索、复杂查询和聚合分析功能。
      • 分布式架构:ES采用分布式架构,可以水平扩展,处理大规模数据集和高并发请求。
      • 多种数据类型支持:ES支持结构化数据、半结构化数据和非结构化数据的索引和搜索。
    • 场景:
      • 适用于日志分析、全文搜索、实时数据分析、监控指标分析等需要快速搜索和聚合大量数据的场景。
  3. MongoDB:

    • 类型:文档型数据库(NoSQL)。
    • 优势:
      • 灵活的数据模型:MongoDB使用文档模型存储数据,可以灵活地存储和查询复杂的非结构化数据。
      • 高可扩展性:MongoDB支持水平扩展,可以处理大规模数据和高并发访问。
      • 高性能:MongoDB具备高性能的读写能力,并支持索引加速查询。
    • 场景:
      • 适用于大数据、实时分析、内容管理、社交网络、物联网等需要灵活数据模型和高可扩展性的场景。
  4. ClickHouse (CK):

    • 类型:列式数据库。
    • 优势:
      • 高性能:ClickHouse专注于分析查询,具备出色的查询性能和高吞吐量。
      • 列式存储:CK采用列式存储,适用于大规模数据的聚合查询和分析。
      • 实时数据处理:CK支持实时数据导入和查询,适用于实时分析和报表生成。
    • 场景:
      • 适用于大规模数据分析、OLAP(联机分析处理)、实时报表生成等需要高性能查询和分析的场景。

总结起来,MySQL适用于传统关系型数据库应用,ES适用于实时搜索和分析,MongoDB适用于灵活数据模型和高可扩展性的场景,CK适用于大规模数据分析和实时查询。选择适合的数据库取决于具体的需求、数据特点和业务场景。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值