MongoDB基础知识

​ 文档是mongodb中的最初单元,类似于mysql中的行,集合可以看做一个具有动态模式的表,mongodb可以拥有多个互相独立的数据库,每个数据库,都拥有自己的集合;每一个文档都有一个特殊的健:"_id",这个健在文档所在的集合中是独一无二的;mongodb自带了一个功能强大的shell,可以用于管理mongodb。

一、文档

文档是键值对的一个有序集,{"hgq":"123","tzy":"123"}与{"tzy":"123","hgq":"123"}是完全不同的两个文档;

文档严格区分大小写,还需分类型,{"tzy":"1234","tzy":123},前者代表字符串,后者代表数字;

在文档中,不能有重复的键,{"tzy":"1234","tzy":"123"}是不合法的

二、集合

集合就是一组文档,如果将文档比喻成mysql中的行,集合相当于一张表

1、动态模式

一个集合里面的文档可以是各种个样的,可以没有固定的格式。

为什么使用多个集合?

  • 方便管理,进行分类
  • 查询速度快
  • 数据会更加集中
  • 方便常见索引

2、命名

不能包涵\0字符串,这字符表示集合名称结束

不能以"system."开头,这个是为系统集合保留的,比如system.users保存的是用户的信息,system.namespaces保存所有集合的信息

3、子集合

推荐使用子集合,组织数据更加高效。

例如博客系统,子集合blog.posts和blog.authors,为了使组织结构更加清晰,这里的blog集合甚至都不需要存在,blog集合和子集合没有什么关系。

三、数据库

在mongoDB中,多个文档组成集合,多个集合可以组成数据库。一个mongoDB可以有多个库,每个库都有独立的权限,即使在磁盘中,不同的数据库也放置在不同的文件中,在文件中,数据库名对应着目录的文件名,相关命名规则也保持和文件命名规则相同。

默认数据库

  1. admin:如果将用户添加到admin数据库,则默认获得所有数据库的权限,一切特定的命令必须在admin数据库运行,比如列出所有数据库或者关闭服务器。
  2. local:此数据库不可复制,所有的本地集合被存在这个数据库中。
  3. config:分片相关配置存放在此数据库中。

四、mongodb shell简介

登录mongodb

复制代码
mongo mongodb://<my ip>:27017

1、shell中的基本操作

默认会进入test数据库,可以通过db命令查看

复制代码
>db
test

查看所有数据库

复制代码
>show dbs;

切换数据库

复制代码
>use admin;
1、创建
复制代码
#定义post
>post ={"name":"hgq","age":18,"class":"4"}
{ "name" : "hgq", "age" : 18, "class" : "4" }

#将post插入到foo集合中
>db.foo.insert(post)
WriteResult({ "nInserted" : 1 })

#查看foo集合
>db.foo.find()
{ "_id" : ObjectId("667106f462f6c8bf0225adbd"), "name" : "hgq", "age" : 18, "class" : "4" }

可以看到输入的键值被完整记录,还有一个额外添加的键值"_id"

2、读取

find和findOne都可以查看集群中的文档,find默认会返回20个文档,findOne只会返回一个文档。后面会详细介绍查询

3、更新

使用update进行更新数据,update至少需要两个参数,第一个是限定条件,用于匹配待更新的文档,第二个是新文档。

复制代码
>post.comments=[]
#插入post
>db.foo.update({class:"4"},post)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
#查看foo集合
>db.foo.find()
{ "_id" : ObjectId("667106f462f6c8bf0225adbd"), "name" : "hgq", "age" : 18, "class" : "4", "comments" : [ ] }
4、删除

通过remove进行删除,删除匹配的文档

复制代码
> db.foo.remove({"class":"4"})
#查看foo集合
>db.foo.find()

五、数据类型

1、基本数据类型

一共有6种基本的数据类型:nul l、布尔、数字、字符串、数组、对象

null:表示空值或者不存在的字段

布尔型:true、false

数值:包括整型和浮点型

字符串:UTF-8都支持

日期:日期被存储为新纪元以来的毫秒数

复制代码
{"s""new Data()}

数组:

复制代码
{""}

内嵌文档

复制代码
{"2":{"11":"33"}}

对象id

复制代码
{ "_id" : ObjectId("666a6e7e97a427d1d07460b5") }

/Public/极无双2/极2包/对外测试/HMT公测/1.20.X/win/1.20.602

2、日期

日期:日期被存储为新纪元以来的毫秒数,并未存储对应时区

复制代码
{"s""new Data()}

3、数组

数组是一组值,可以作为有序对象,也能作为无序对象来操作。

复制代码
{"hgq":["xx",11]}

数组中可以包含不同类型的数据,可以对数组进行查询和修改

4、内嵌文档

示例如下,可以更加直观的显示层级信息

复制代码
{"2":{"11":"33"}}

5、_id和ObjectID

每一个文档必须有一个_id键,默认是一个ObjectId对象,在一个集合里面,每个对象都有一个唯一的id,确保集合中的文档被唯一标识,会自动生成。

六、使用mongodb shell

++.mongorc.js文件存在于每个用户家目录下++

通过修改.mongorc.js文件来移除比较危险的命令,也就是重写内置的函数

复制代码
cat .mongorc.js 

var no=function(){
print("注意⚠️,线上数据库,切勿执行删除操作!!!")
};
//禁止删除数据库
db.dropDatabase=DB.prototype.dropDatabase = no ;
//禁止删除集合
DBCollection.prototype.drop = no ;
//禁止删除索引
DBCollection.prototype.dropIndex = no ;

显示效果

复制代码
> db.dropDatabase()
注意⚠️,线上数据库,切勿执行删除操作!!!

此操作并不能保护数据库收到恶意攻击,只能防止自己人手误。

在启动时添加"--norc"参数,就可以禁止加载.mongorc.js文件

相关推荐
源远流长jerry3 分钟前
MySQL的缓存策略
数据库·mysql·缓存
纯纯沙口18 分钟前
Qt—用SQLite实现简单的注册登录界面
数据库·sqlite
初次见面我叫泰隆31 分钟前
MySQL——3、数据类型
数据库·mysql
一叶屋檐1 小时前
Neo4j 图书馆借阅系统知识图谱设计
服务器·数据库·cypher
好吃的肘子2 小时前
MongoDB 应用实战
大数据·开发语言·数据库·算法·mongodb·全文检索
weixin_472339462 小时前
MySQL MCP 使用案例
数据库·mysql
lqlj22333 小时前
Spark SQL 读取 CSV 文件,并将数据写入 MySQL 数据库
数据库·sql·spark
独泪了无痕3 小时前
MongoTemplate 基础使用帮助手册
spring boot·mongodb
遗憾皆是温柔3 小时前
MyBatis—动态 SQL
java·数据库·ide·sql·mybatis
未来之窗软件服务4 小时前
Cacti 未经身份验证SQL注入漏洞
android·数据库·sql·服务器安全