【MongoDB】_01 介绍和基本使用

简介

官网
MongoDB是⼀个基于分布式⽂件存储的数据库 ,由C++语⾔编写。旨在为WEB应⽤提供可扩展⾼性能数据存储解决⽅案,是⼀个 介于关系数据库和⾮关系数据库 之间的产品。
它⼏乎可以实现类似关系数据库单表查询的绝⼤部分功能,⽽且还⽀持对数据建⽴索引

特点

  • ⾯向集合存储,易存储对象类型的数据
  • ⽀持查询,以及动态查询
  • ⽀持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语⾔
  • ⽂件存储格式为BSON(⼀种JSON的扩展)⽀持复制和故障恢复和分⽚
  • ⽀持事务⽀持
  • 索引 聚合 关联…

安装

我这里基于docker安装5.0.5版本

docker run -d --name mongo -p 27017:27017 mongo:5.0.5

进入容器并且使用mongo命令进行连接

C:\Users\User>docker exec -it 9bf88063fd80 bash
root@9bf88063fd80:/# mongo
MongoDB shell version v5.0.5
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("40596d24-63b0-4fb0-8c31-7edce01a2d54") }
MongoDB server version: 5.0.5
================
Warning: the "mongo" shell has been superseded by "mongosh",
which delivers improved usability and compatibility.The "mongo" shell has been deprecated and will be removed in
an upcoming release.
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
================
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        https://docs.mongodb.com/
Questions? Try the MongoDB Developer Community Forums
        https://community.mongodb.com
---
The server generated these startup warnings when booting:
        2023-03-04T01:42:41.865+00:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem
        2023-03-04T01:42:42.953+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
        2023-03-04T01:42:42.954+00:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'
---
---
        Enable MongoDB's free cloud-based monitoring service, which will then receive and display
        metrics about your deployment (disk utilization, CPU, operation statistics, etc).

        The monitoring data will be available on a MongoDB website with a unique URL accessible to you
        and anyone you share the URL with. MongoDB may use this information to make product
        improvements and to suggest MongoDB products and deployment options to you.

        To enable free monitoring, run the following command: db.enableFreeMonitoring()
        To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
>

这之后就可以通过命令行操作mongo了

核心概念

理解成Mysql的库

集合

理解成mysql的表

文档

理解成mysql的一行数据
MongoDB就是比较像关系型数据库,更加灵活多变

基本操作

我这里就使用datagrip来展示MongoDB的操作

  1. 查询所有库
show databases;
show dbs;

这两个都是查询所有,mongo默认会有:admin、config、local三个库

  • admin : 从权限的⻆度来看,这是"root"数据库。要是将⼀个⽤户添加到这个数据库,这个⽤户⾃动
    继承所有数据库的权限。⼀些特定的服务器端命令也只能从这个数据库运⾏,⽐如列出所有的数据库
    或者关闭服务器。
  • local : 这个数据永远不会被复制,可以⽤来存储限于本地单台服务器的任意集合
  • config : 当Mongo⽤于分⽚设置时,config数据库在内部使⽤,⽤于保存分⽚的相关信息。
  1. 创建库
use temp;
show dbs; // 此时temp不显示
db.circle.insertOne({"name":"IT"});
show dbs; // 此时才会显示

这里创建之后不会直接显示,库里有数据才会显示

  1. 删除库
db.dropDatabase();
show dbs;
db; //查询所在的库,还会显示被删除的库

默认删除当前库,注意一点,删除后不切换库,直接db查询当前的库还是会显示已经被删除的库

集合

  1. 查询库中所有集合
use temp;
db.createCollection("circle");
show collections;
show tables;

show collections 和 show tables都能查询出此库中所有集合

  1. 创建集合
 db.createCollection('集合名称', [options])

options可以是如下参数:

字段类型类型
capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定⼤⼩的集合,当达到最⼤值时,它会⾃动覆盖最早的⽂档。 当该值为 true 时,必须指定 size 参数。
size布尔(可选)为固定集合指定⼀个最⼤值,即字节数。 如果 capped 为 true,也需要指定该字段。
max数值(可选)指定固定集合中包含⽂档的最⼤数量。

注意:当集合不存在时,向集合中插⼊⽂档也会⾃动创建该集合。

db.createCollection("col",{capped:true,max:1,size:2});
show collections;
db.col.insertMany([{"name":"1"},{"name":"2"},{"name":"3"}]);
db.col.find();

结果是只剩下了最后一条,意思是最后的数据把之前的数据都覆盖了
在这里插入图片描述

  1. 删除集合

db.集合名称.drop();

db.col.drop();
show collections;

文档

1.插入

单条:db.集合名称.insert(文档);
单条:db.集合名称.insertMany(文档数组);
JS(ES6)方式:

for(let i=0;i<100;i++){
 db.集合名称.insert({"_id":i,"name":"abc"+i,"age":23});
}

注意:在 mongodb 中每个⽂档都会有⼀个_id作为唯⼀标识,_id默认会⾃动⽣成如果⼿动指定将使⽤⼿动指定的值作为_id 的值。

  1. 更新
    前面对象指定条件,后面对象指定更新的值,可以新增字段
db.temp.updateOne({"name":"abc1"},{$set:{"age":1}});
db.temp.updateMany({"name":"abc"},{$set:{"age":2}});
  1. 查询
    查询方式比较多

基本语法

使用find()

db.集合名称.find(query, projection)
  • query :可选,使⽤查询操作符指定查询条件
  • projection :可选,就是说你查询哪个字段,不写就是查所有
db.temp.find({"name":"abc"});

如果你需要以易读的⽅式来读取数据,可以使⽤ pretty() ⽅法,语法格式如下:

 db.集合名称.find().pretty()

这种就是如果查询出的记录数超过一定长度会给你格式化一下

对比的语法

对比方式格式
等于{key:value}
小于{key:{$lt:}value}
小于等于{key:{$lte:}value}
大于{key:{$gt:}value}
大于等于{key:{$gte:}value}
不等于{key:{$ne:}value}

如:

db.temp.find({age:{$lte:2}});

and or

  • and
db.集合名称.find({key1:value1, key2:value2,...}).pretty()
  • or
 db.集合名称.find(
 {
 $or: [
 {key1: value1}, {key2:value2}
 ]
 }
).pretty()

如:

db.temp.find({$or:[{"name":"abc"},{age:{$gte:2}}]});

// and 和 or
db.temp.find({"age": {$gt:50}, $or: [{"name": "编程不良⼈"},{"name":
"MongoDB"}]}).pretty();

数组查询

db.temp.insertOne({ "_id" : 11, "age" : 29, "likes" : [ "看电视", "读书xx", "美⼥" ], "name"
: "abc" });
db.temp.find({likes:"看电视"}).pretty();
db.temp.find({likes:{$size:3}}).pretty();

模糊查询

主要是通过正则来实现

db.temp.find({name:/_/}).pretty();

其他

排序
db.temp.find({name:/a/}).sort({age:-1,name:1}).pretty();
分页
db.temp.find({name:/a/}).sort({age:-1,name:1}).skip(1).limit(1).pretty();
总条数
db.temp.find({name:/a/}).count();
去重

这里的字段需要引号

db.temp.distinct("name");
返回指定字段
db.temp.find({},{name:1,age:1});

注意:_id是默认显示的,如果不想显示可以设置0

$type

$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。常用的类型有以下几种:
在这里插入图片描述

db.temp.find({name:{$type:2}});
db.temp.find({name:{$type:'string'}});

既可以写数字也可以写类型名

索引

索引是特殊的数据结构,索引存储在⼀个易于遍历读取的数据集合中,索引是对数据库表中⼀列或多列的值进⾏排序的⼀种结构。
在这里插入图片描述
MongoDB中的索引与其他数据库系统中的索引类似。MongoDB在集合层⾯上定义了索引,并⽀持对MongoDB集合中的任何字段或⽂档的⼦字段进⾏索引。

操作

创建

注意:_id是默认的唯一索引
db.集合名称.createIndex(key:order, options);options可选,如:

db.temp.createIndex({name:1});

后面的排序字段不能省略
options可选参数如下

参数类型描述
backgroundBoolean建索引过程会阻塞其它数据库操作,background可指定以后台⽅式创建索引,即增加 “background” 可选参数。 “background” 默认值为false。
uniqueBoolean建⽴的索引是否唯⼀。指定为true创建唯⼀索引。默认值为false.
namestring索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序⽣成⼀个索引名称。
sparseBoolean对⽂档中不存在的字段数据不启⽤索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的⽂档.。默认值为 false.
expireAfterSecondsinteger指定⼀个以秒为单位的数值,完成 TTL设定,设定集合的⽣存时间。
vindex version索引的版本号。默认的索引版本取决于mongod创建索引时运⾏的版本。
weightsdocument索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_languagestring对于⽂本索引,该参数决定了停⽤词及词⼲和词器的规则的列表。 默认为英语
language_overridestring对于⽂本索引,该参数指定了包含在⽂档中的字段名,语⾔覆盖默认的language,默认值为 language.

查看

  1. 集合索引
db.temp.getIndexes();
  1. 集合索引大小
    单位是字节
db.temp.totalIndexSize();

删除

  1. 删除所用
 db.集合名称.dropIndexes()
  1. 删除指定
db.集合名称.dropIndex("索引名称")

复合索引

一样是最左匹配,但是就像mysql,mongo会自己帮你调整顺序

db.集合名称.createIndex({"name":1,"age":-1})

聚合

原始数据:

db.temp.insertMany([
    {
        "title": 'MongoDB Overview',
        "description": 'MongoDB is no sql database',
        "by_user": 'runoob.com',
        "url": 'http: //www.runoob.com',
        "tags": ['mongodb', 'database', 'NoSQL'],
        "likes": 100
    },
    {
        "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
    },
    {
        "title": 'Neo4j Overview',
        "description": 'Neo4j is no sql database',
        "by_user": 'Neo4j',
        "url": 'http: //www.neo4j.com',
        "tags": ['neo4j', 'database', 'NoSQL'],
        "likes": 750
    },
    {
        "title": 'Neo4j Overview',
        "description": 'Neo4j is no sql database',
        "by_user": 'Neo4j',
        "url": 'http: //www.neo4j.com',
        "tags": ['neo4j', 'database', 'NoSQL'],
        "likes": 750
    }
]);

详细

计算每个作者所写的⽂章数,使⽤aggregate()计算结果如下:

db.temp.aggregate([{$group:{_id:"$by_user", num_tutorial:{$sum : 1}}}]);

// 多字段
db.temp.aggregate([{$group:{_id:{"by_user":"$by_user","age":"$age"}, num_tutorial:{$sum : 1}}}]);

注意这里的_id不是文档的那个_id,而是需要分组的字段
常见的表达式还有:

在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值