文档是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可以有多个库,每个库都有独立的权限,即使在磁盘中,不同的数据库也放置在不同的文件中,在文件中,数据库名对应着目录的文件名,相关命名规则也保持和文件命名规则相同。
默认数据库
- admin:如果将用户添加到admin数据库,则默认获得所有数据库的权限,一切特定的命令必须在admin数据库运行,比如列出所有数据库或者关闭服务器。
- local:此数据库不可复制,所有的本地集合被存在这个数据库中。
- 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文件