MongoDB入门

一、什么事NoSQL?

NoSQL:Not Only SQL ,本质也是一种数据库的技术,相对于传统数据库技术,它不会遵循一些约束,比如:sql标准、ACID属性,表结构等。
Nosql优点

  • 满足对数据库的高并发读写
  • 对海量数据的高效存储和访问
  • 对数据库高扩展性和高可用性
  • 灵活的数据结构,满足数据结构不固定的场景
    Nosql缺点
  • 一般不支持事务
  • 实现复杂SQL查询比较复杂
  • 运维人员数据维护门槛较高
  • 目前不是主流的数据库技术

1.1 NoSQL分类

在这里插入图片描述
db-engines排名

在这里插入图片描述

二、MongoDB入门

2.1 什么是MongoDB?

MongoDB:是一个数据库 ,高性能、无模式、文档性,目前nosql中最热门的数据库,开源产品,基于c++开发。是nosql数据库中功能最丰富,最像关系数据库的。
特性
l 面向集合文档的存储:适合存储Bson(json的扩展)形式的数据;
l 格式自由,数据格式不固定,生产环境下修改结构都可以不影响程序运行;
l 强大的查询语句,面向对象的查询语言,基本覆盖sql语言所有能力;
l 完整的索引支持,支持查询计划;
l 支持复制和自动故障转移;
l 支持二进制数据及大型对象(文件)的高效存储;
l 使用分片集群提升系统扩展性;
l 使用内存映射存储引擎,把磁盘的IO操作转换成为内存的操作;

2.2 什么需求场景下使用MongoDB?

并没有某个业务场景必须要使用 MongoDB才能解决,但使用 MongoDB 通常能让你以更低的成本解决问题(包括学习、开发、运维等成本)
如果以下有1个 Yes,可以考虑 MongoDB,2个及以上的 Yes,选择MongoDB绝不会后悔!
在这里插入图片描述

2.3 MongoDB使用场景

MongoDB 的应用已经渗透到各个领域,比如游戏、物流、电商、内容管理、社交、物联网、视频直播等,以下是几个实际的应用案例:
l 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新
l 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
l 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能
l 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析
l 视频直播,使用 MongoDB 存储用户信息、礼物信息等

三、MONGODB的应用与开发

3.1 MongoDB的安装

3.1.1 官网下载安装包:

https://www.mongodb.com/try/download/community
在这里插入图片描述
下载:wget ‘https://fastdl.mongodb.org/linux/mongodb-linux-aarch64-ubuntu2004-8.0.0.tgz’
解压:tar -zxvf mongodb-linux-aarch64-ubuntu2004-8.0.0.tgz

3.1.2 修改环境变量

vi /etc/profile
export MONGODB_HOME=/home/bing/app/mongodb8
export PATH= P A T H : {PATH}: PATH:{MONGODB_HOME}/bin
source /etc/profile
创建mongodb存储目录
mkdir -p ~/mongodb-home/data
mkdir -p ~/mongodb-home/logs

3.1.3 启动

mongod --dbpath /home/parallels/mongodb-home/data --logpath /home/parallels/mongodb-home/logs/mongod.log --fork

//查看启动后的进程
ps -ef|grep mongodb
bing        6564       1  9 21:56 ?        00:00:01 mongod --dbpath /home/bing/app/mongodb-home/data --logpath /home/bing/app/mongodb-home/logs/mongod.log --fork
bing        6620    5839  0 21:56 pts/0    00:00:00 grep --color=auto mongodb

安装过程中遇到的问题:
mongod: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory
问题解决:
系统无法找到名为libcrypto.so.1.1的共享库文件。共享库文件是一些可被多个程序共享使用的代码和数据的集合,它们在系统中被动态加载
Ubuntu安装:sudo apt-get install libssl-dev
centos安装所有(安装完即可,下面两步Ubuntu执行) : yum install -y libcrypto.so.*
查找路径:find / -name libcrypto.so.1.1
更新库:sudo ldconfig /path //查找到的路径

3.1.4 MongoDB默认数据库

MongoDB默认会创建admin、config、local、test数据库。test库是一个默认的数据库,除了test库外admin、config、local库为系统库。admin库主要存储MongoDB的用户、角色等信息,config库主要存储分片集群基础信息,local库主要存储副本集的元数据。

3.2 MongoDB的基本概念

MongoDB 将数据记录存储为文档(具体来说是 BSON 文档),并将它的汇集在集合中。数据库存储一个或多个文档集合。
和关系数据库的对应关系如下:

MongoDB: 数据库 -> 集合 -> 文档
关系数据库:数据库 -> 表 -> 记录

3.3 MongoDB的增删改查

3.3.1.基本操作

选择和创建数据库的语法格式:

use 数据库名称

查看有权限查看的所有的数据库命令

show dbs
或
show databases

admin : 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合config : 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

集合的操作
新增:

db.createCollection(name)

隐式的方式

db.test_d.insert({u_id:1,goods_id:1});

集合的查询

show tables;

集合的命名规范:集合名不能是空字符串 “”。集合名不能含有 \0字符(空字符),这个字符表示集合名的结尾。集合名不能以 "system."开头,这是为系统集合保留的前缀。用户创建的集合名字不能含有保留字符。另外千万不要在名字里出现$。
文档的插入

 db.test.insert("")

批量插入

db.comment.insertMany([{"id" : 110, "name" : "lijin", "createdatetime" : new Date(), "content" : "今天下雨,天气不好"},{"id" : 110, "name" : "lijin", "createdatetime" : new Date(), "content" : "今天下雨,天气不好"},{"id" : 110, "name" : "lijin", "createdatetime" : new Date(), "content" : "今天下雨,天气不好"},{"id" : 110, "name" : "lijin", "createdatetime" : new Date(), "content" : "今天下雨,天气不好"}
]);

文档的基本查询
查询数据的语法格式如下:

db.collection.find(<query>, [projection])

文档的更新

db.collection.update(query, update, options)

文档的删除

db.collection.remove(条件)
db.collection.remove({_id:"1"})
db.comment.remove({})  删除全部

3.3.2.复杂操作

统计查询

db.collection.count(query, options)

db.note.count();  --统计所有记录

db.note.count({name:"king"});  --统计name为king的记录条数

分页列表查询

db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
limit()方法来读取指定数量的数据,使用skip()方法来跳过指定数量的数据

db.note.find().limit(3)

db.note.find().skip(3)

分页查询:需求:每页5个

db.note.find().skip(0).limit(5)   //第一页
db.note.find().skip(5).limit(5)   //第二页
db.note.find().skip(10).limit(5)   //第三页

排序查询

db.集合名称.find().sort(排序方式)          1升序、-1降序
db.note.find().sort({name:-1,id:-1})

skip(), limit(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit(),和命令编写顺序无关

db.note.find().skip(0).limit(5).sort({name:-1,id:-1})

正则表达式

db.集合.find({字段:/正则表达式/})           正则表达式是 js的语法
db.note.find({content:/下雨/})               content包含'下雨'的
db.note.find({name:/^k/})                    name是k开头的

比较查询

db.集合名称.find({ "field" : { $gt: value }}) // 大于: field > value
db.集合名称.find({ "field" : { $lt: value }}) // 小于: field < value
db.集合名称.find({ "field" : { $gte: value }}) // 大于等于: field >= value
db.集合名称.find({ "field" : { $lte: value }}) // 小于等于: field <= value
db.集合名称.find({ "field" : { $ne: value }}) // 不等于: field != value
db.note.find({id:{$gt:252}})

db.note.find({$and:[{id:{$gt:252}},{id:{$lt:256}}]})

条件连接查询

$and:[ {  },{  },{ } ]

包含查询

db.note.find({id:{$in: [252,254]}})

3.4.索引-Index

索引(Index)是帮助MongoDB高效获取数据的数据结构,索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。

MongoDB索引使用B树数据结构(确切的说是B-Tree,MySQL是B+Tree)

3.4.1 索引的管理

索引的创建

db.collection.createIndex(keys, options) 
案例:对 note的content字段建立索引
db.note.createIndex({content:1})    --1是按照指定按升序创建索引   -1按降序来创建索引

在这里插入图片描述

查看索引

db.note.getIndexes();  --查看索引

复合索引:对name 和content 同时建立复合(Compound)索引:

db.note.createIndex({name:1,content:1})

索引的移除

db.collection.dropIndex(index) --移除指定索引
db.collection.dropIndexes()   --移除所有索引
案例:删除note的的content索引
db.note.dropIndex({content:1})
对于 MongoDB入门,你可以按照以下步骤进行学习: 1. 下载并安装 MongoDB:在 MongoDB 的官方网站上下载适合你操作系统的安装程序,并按照提示进行安装。 2. 启动 MongoDB 服务:安装完成后,启动 MongoDB 服务。在 Windows 上,你可以通过运行 `mongod` 命令启动服务。在 macOS 或 Linux 上,可以打开终端并运行 `mongod` 命令。默认情况下,MongoDB 会在本地的 27017 端口上启动。 3. 连接到 MongoDB:在另一个终端窗口或命令提示符中,使用 `mongo` 命令连接到 MongoDB。默认情况下,它会连接到本地的 MongoDB 服务器。 4. 创建数据库:在 `mongo` shell 中,可以使用 `use <database_name>` 命令创建一个新数据库,例如 `use mydb`。 5. 创建集合(表):集合类似于关系数据库中的表。你可以使用 `db.createCollection("<collection_name>")` 命令创建一个新集合,例如 `db.createCollection("mycollection")`。 6. 插入数据:使用 `db.<collection_name>.insertOne(<document>)` 命令将数据插入到集合中。例如,`db.mycollection.insertOne({ name: "John", age: 30 })`。 7. 查询数据:使用 `db.<collection_name>.find()` 命令查询集合中的所有数据。例如,`db.mycollection.find()`。 8. 更新数据:使用 `db.<collection_name>.updateOne(<filter>, <update>)` 命令更新集合中的数据。例如,`db.mycollection.updateOne({ name: "John" }, { $set: { age: 35 } })`。 9. 删除数据:使用 `db.<collection_name>.deleteOne(<filter>)` 命令删除集合中的数据。例如,`db.mycollection.deleteOne({ name: "John" })`。 这是一个 MongoDB 入门的基本流程。你可以根据需要进一步学习和探索 MongoDB 的更多功能和用法。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值