MongoDB--shell的使用以及术语概念

MongoDB–shell的使用以及术语概念


在这里插入图片描述

一:术语概念

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"})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值