MongoDB–shell的使用以及术语概念
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f90ae2f88f36a4a45ecabab0229ed4ac.png)
一:术语概念
1.数据库(database)
一个MongoDB中可以建立以多个数据库,MongoDB的默认数据库为"db",存储在自己建立的data目录中,每一个实例可以容纳多个独立的数据库,每一个数据库都有自己的集合和权限,不同的数据库也可以放在不同的文件中。
show dbs显示所有数据库列表
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
db显示当前数据库对象或集合
> db
test
use可以连接到指定数据库
> use admin
switched to db admin
关于数据库命名的注意要点:
- 不能是空字符串("")。
- 不得含有’ '(空格)、.、$、/、\和\0 (空字符)。
- 应全部小写。
- 最多64字节。
MongoDB自带的三个数据库是比较特殊的:
admin:从权限的角度来看,这是“root"数据库,类似与mysql的user,主要是权限管理,添加用户到这个数据库就可以继承所以数据库的权限。些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local:这个单词就是本地的意思,可以用来存储限于本地单台服务器的任意集合,而且不会被复制。
config:MongoDB用于切片设置,config在内部使用,用于保存切片的相关信息
2.集合(collection)
2.1 动态模式
集合就是文档组,类似于RDBMS中的table表,每一个集合中可以存多个文档(document),集合存在数据库中,集合没有固定的结构,可以在集合里面存任意的不同格式的文档,所以说是动态模式。但是一般都是有关联性的,在MongoDB中没有要求创建多个集合,但是为了便于查询和便于管理,可以创建多个集合。当第一个文档插入的时候集合就会被创建。
{"site":"www.baidu.com"}
{"site":"www.google.com","name":"Google"}
{"site":"www.bilibili.com","name":"ITgagaga","num":5}
2.2 关于集合名需要注意的
- 集合名可以是满足以下条件的任意UTF-8字符串
- 集合名不能是空字符串(“”)
- 集合名不能包含\0字符(空字符)。这个字符表示集合名的结束
- 集合名不能以“system.”开头,这个是为系统集合保留的前缀,例如“sysytem.users”这个集合保留数据库用户信息
- 不能包含保留字符“$”,因为很多系统集合中有
2.3 子集合
可以使用"."分隔符分隔不同命名空间的子集合。使用子集合可以使组织结构更加清晰。
例如GridFS(一种存储大文件的协议)和大多数驱动程序都使用了子集合。
2.4 定容集合(capped collections)
2.4.1 简单介绍
capped collections是性能出色的有着固定大小的集合(定容集合),以LRU(Least Recently Used最近最少使用)规则和插入顺序进行 age-out(老化移出)处理,自动维护集合中对象的插入顺序,在创 建时要预先指定大小。如果空间用完,新添加的对象将会取代集合中最旧的对象。
2.4.2 功能特点
- 可以插入及更新,但更新不能超出 collection 的大小,否则更新失败。不允许删除,可 以调用 drop() 删除集合中的所有行,但是 drop 后需要显式地重建集合。在 32 位机上,一 个capped collection的最大值约为482.5M,64 位上只受系统文件大小的限制。 Capped collections 是高性能自动的维护对象的插入顺序。
- 它非常适合类似记录日志的功能和标准的 collection 不同,你必须要显式的创建一个capped collection,指定一个 collection 的大小,单位是字节。collection 的数据存储空间值提前分配的。
- Capped collections 可以按照文档的插入顺序保存到集合中,而且这些文档在磁盘上存放位置也是按照插入顺序来保存的,所以当我们更新Capped collections 中文档的时候,更新后的文档不可以超过之前文档的大小,这样话就可以确保所有文档在磁盘上的位置一直保持不变。
- 由于 Capped collection 是按照文档的插入顺序而不是使用索引确定插入位置,这样的话可以提高增添数据的效率
2.4.3 常见用处
1.logging:MongoDB 中日志机制的首选,MongoDB 没有使用日志文件,而是把日志事件存储在数 据库中。在一个没有索引的capped collection中插入对象的速度与在文件系统中记录日 志的速度相当。
2.cache :缓存一些对象在数据库中,比如计算出来的统计信息。这样的需要在 collection 上建立 一个索引,因为使用缓存往往是读比写多。
3.auto archiving :可以利用capped collection的age-out特性,省去了写cron脚本进行人工归档的工作。
2.4.4 推荐用法
1.为了发挥capped collection的最大性能,如果写比读多,最好不要在上面建索引,否则插入速度从"log speed"降为"database speed"。
2.使用"nature ordering"可以有效地检索最近插入的元素,因为capped collection能够保证自然排序就是插入时的顺序,类似于log文件上的tail操作。
2.4.5 注意事项
1.可以在创建capped collection时指定collection中能够存放的最大文档数。但这时也要指定size,因为总是先检查size 后检查maxRowNumber。可以使用validate()查看一个collection 已经使用了多少空间,从而决定size设为多大。
db.mycoll.validate();
db.createCollection("mycoll", {capped:true, size:100000, max:100});
max=1会往collection中存放尽量多的documents。
2.上述的 createCollection 函数也可以用来创建一般的 collection,还有一个参数"autoIndexID",值可以为"true"和"false"来决定是否需要在"_id"字段上自动创建索引,如:
db.createCollection("mycoll", {size:10000000, autoIndexId:false})
默认情况下对一般的collection是创建索引的,但不会对capped collection创建。
3.文档(document)
文档是MongoDB的核心概念,类似于RDBMS中的行,MongoDB中文档数据是以键值对的形式存在的。通常一个文档有多个键值对。
3.1 文档特点
1.MongoDB区分类型
{"aa":"123"}
{"aa":123}
是两个文档
2.MongoDB区分大小写
{"AA":123}
{"aa":123}
是两个文档
3.MongoDB中的文档不能有重复的键
4.文档中的键值对是有顺序的
{"x":1,"y":2}
{"y":2,"x":1}
是两个文档
3.2 关于键的命名
- 不能含有\0(空字符)
- .和$具有特殊意义,不能随便使用
4.元数据
元数据存储在集合中,使用了系统的命名空间。
对于修改系统集合中的对象有如下限制。
在{{system.indexes}}插入数据,可以创建索引。但除此之外该表信息是不可变的(特殊的drop index命令将自动更新相关信息)。
{{system.users}}是可修改的。 {{system.profile}}是可删除的。
二:shell的使用
1.运行shell
1.0 启动shell
cd /usr/local/mongodb/bin //进入安装目录的bin下面启动,以加载配置文件的方式
./mongod -f mongodb.conf
1.1 简单数学运算
> x=200
200
> x/4
50
1.2 调用JavaScript标准函数库
> Math.sin(Math.PI / 2);
1
> new Date("2010/1/1");
ISODate("2009-12-31T16:00:00Z")
> "Hello,word!".replace("word","Mongo");
Hello,Mongo!
1.3 自定义js函数
> function f1(n) {
... if(n<5) return 2;
... return 1;
... }
> f1(4)
2
2.客户端以及shell
shell是一个独立的MongoDB客户端,启动的时候shell回连接到MongoDB服务器的test数据库,并且将数据库连接复制给全局变量db.这个变量是通过shell访问MongonDB的主要入口点。
> db
test
>
语法糖:选择数据库,会发现db又指向admin了
> use admin;
switched to db admin
> db
admin
>
3.shell的基本操作
3.1 创建
insert函数可以将文档添加到集合中。
> post={"title":"My mongo","content":"hello word!","date":new Date()}
{
"title" : "My mongo",
"content" : "hello word!",
"date" : ISODate("2019-11-21T03:08:36.121Z")
}
使用insert()函数添加进集合
> db.blog.insert(post)
WriteResult({ "nInserted" : 1 })
文档已经成功存在数据库中了,使用find方法查看
> db.blog.find()
{ "_id" : ObjectId("5dd60021646aa0dd388e14ad"), "title" : "My mongo", "content" : "hello word!", "date" : ISODate("2019-11-21T03:08:36.121Z") }
3.2 读取
3.2.1 findOne()
findOne()方法可以查询集合里面的文档。
> db.blog.findOne()
{
"_id" : ObjectId("5dd60021646aa0dd388e14ad"),
"title" : "My mongo",
"content" : "hello word!",
"date" : ISODate("2019-11-21T03:08:36.121Z")
}
>
3.2.2 使用find()
使用find()会自动显示最多20个匹配的文档
3.2.3 db.post.find().pretty()
db.post.find().pretty() 结构化查询
> db.blog.find().pretty()
{ "_id" : ObjectId("5dd60021646aa0dd388e14ad"), "title" : "aaa" }
3.3 更新
3.3.1 update命令
update命令格式:
db.collection.update(criteria,objNew,upsert,multi)
参数说明:
- criteria:查询条件
- objNew:update对象和一些更新操作符
- upsert:如果不存在update的记录,是否插入objNew这个新的文档,true为插入,默认为false,不插入。
- multi:默认是false,只更新找到的第一条记录。如果为true,把按条件查询出来的记录全部更新。
使用update,替换文章标题title
db.blog.update({title : "aaa"},{$set:{title:"bbb"}})
默认情况下,MongoDB只更新一个文档。要更新多个文档,需要将参数“multi”设置为true。
db.blog.update({title : "My mongo"},{$set:{title:"bbb"}},{multi : true})
使用update替换文档
post1={"name":"zs","age":"12"}
db.blog.update({title : "bbb"},{post1})
3.3.6 save命令
save()方法根据文档参数更新现有文档或插入新文档
db.COLLECTION_NAME.save({_id:ObjectId(), NEW_DATA})
将新文档保存到指定文档,_id是主键
db.blog.save({_id:"5dd60021646aa0dd388e14ad",name:"wangwu",age:3})
save和insert很像,insert 可以理解 就是 插入 操作;如果主键存在,则抛异常;
save 可以理解为 插入或 更新;如果 _id 的值 存在就更新,不存在就插入。
3.4 删除
db.blog.remove({"title" : "bbb"})