本文共 6186 字,大约阅读时间需要 20 分钟。
目录
一、简单介绍
1-1 易用
MongoDB是一个面向文档(document-oriented)的数据库,而不是关系型数据库。
不采用关系型主要是为了获得更好得扩展性。当然还有一些其他好处,与关系数据库相比,面向文档的数据库不再有“行“(row)的概念取而代之的是更为灵活的“文档”(document)模型。通过在文档中嵌入文档和数组,面向文档的方法能够仅使用一条记录来表现复杂的层级关系,这与现代的面向对象语言的开发者对数据的看法一致。 另外,不再有预定义模式(predefined schema):文档的键(key)和值(value)不再是固定的类型和大小。 由于没有固定的模式,根据需要添加或删除字段变得更容易了。通常由于开发者能够进行快速迭代,所以开发进程得以加快。而且,实验更容易进行。开发者能尝试大量的数据模型,从中选一个最好的。1-2 易扩展
应用程序数据集的大小正在以不可思议的速度增长。随着可用带宽的增长和存储器价格的下降,即使是一个小规模的应用程序,需要存储的数据量也可能大的惊人,甚至超出了很多数据库的处理能力。过去非常罕见的T级数据,现在已经是司空见惯了。
由于需要存储的数据量不断增长,开发者面临一个问题:应该如何扩展数据库,分为纵向扩展和横向扩展,纵向扩展是最省力的做法,但缺点是大型机一般都非常贵,而且当数据量达到机器的物理极限时,花再多的钱也买不到更强的机器了,此时选择横向扩展更为合适,但横向扩展带来的另外一个问题就是需要管理的机器太多。 MongoDB的设计采用横向扩展。面向文档的数据模型使它能很容易地在多台服务器之间进行数据分割。MongoDB能够自动处理跨集群的数据和负载,自动重新分配文档,以及将用户的请求路由到正确的机器上。这样,开发者能够集中精力编写应用程序,而不需要考虑如何扩展的问题。如果一个集群需要更大的容量,只需要向集群添加新服务器,MongoDB就会自动将现有的数据向新服务器传送1-3 功能丰富
MongoDB作为一款通用型数据库,除了能够创建、读取、更新和删除数据之外,还提供了一系列不断扩展的独特功能;省略这些的功能是处于架构上的考虑,或者说为了得到更好的扩展性,因为在分布式系统中这两个功能难以高效地实现
- 索引
- 支持通用二级索引,允许多种快速查询,且提供唯一索引、复合索引、地理空间索引、全文索引
- 聚合
- 支持聚合管道,用户能通过简单的片段创建复杂的集合,并通过数据库自动优化
- 特殊的集合类型
- 支持存在时间有限的集合,适用于那些将在某个时刻过期的数据,如会话session。类似地,MongoDB也支持固定大小的集合,用于保存近期数据,如日志
- 文件存储
- 支持一种非常易用的协议,用于存储大文件和文件元数据。MongoDB并不具备一些在关系型数据库中很普遍的功能,如链接join和复杂的多行事务。
1-4 性能强
MongoDB的一个主要目标是提供卓越的性能,这很大程度上决定了MongoDB的设计。MongoDB把尽可能多的内存用作缓存cache,视图为每次查询自动选择正确的索引。
总之各方面的设计都旨在保持它的高性能,虽然MongoDB非常强大并试图保留关系型数据库的很多特性,但它并不追求具备关系型数据库的所有功能。只要有可能,数据库服务器就会将处理逻辑交给客户端。这种精简方式的设计是MongoDB能够实现如此高性能的原因之一
二、逻辑结构 and 层次结构
2-1 层次结构
- 数据库 (database)
- 表 – 集合(collection)
- 数据行 - 文档(document)
三、mongodb的常用基本操作
3-0 mongodb默认存在的库
test库:登录时默认存在的库 - 用于测试的库,可随意修改
管理mongodb有关的系统库 - 重要的库,不可随意修改
- admin库:系统预留库,mongodb系统管理库
- local库:本地预留库,存储关键日志
3-1 命令种类 - 基于三大操作对象
3-1-1 基于库的基本操作
show databaseshow dbsuse testdb.[TAB] - 类似于linux中的tab功能,两下TAB进行模糊查询db.help() - db级别的命令使用帮助3-1-2 基于表的基本操作
db.Collection_name.xxx3-1-3 基于数据行的基本操作
db.t1.insert()3-1-4 复制集(replication set)相关
rs.3-1-5 分片集群(sharding cluster)相关
sh.3-2 帮助信息获取方式
helpKEYWORDS.help()KEYWORDS.[TAB] - 单次TAB补全,双击TAB查询show use db.help() - 查询基于库的操作命令db.a.help() - 查询基于库下的命令的操作rs.help() - 查询复制集相关命令sh.help() - 查询分片集群相关命令
四、常用操作总结
4-0 查看当前db版本
test> db.version()4-1 显示当前数据库
test> dbtest或> db.getName()> test4-2 查询所有数据库
test> show dbs4-3 切换数据库
use localswitched to db local查看所有的collectionshow tables;4-4 显示当前数据库状态
test> use localswitched to db locallocal> db.stats()4-5 查看当前数据库的连接机器地址
> db.getMongo()> connection to 127.0.0.1指定数据库进行连接;默认连接本机test数据库
五、mongodb对象操作总结
mongo mysql
库 -----> 库集合 -----> 表文档 -----> 数据行5-1 库操作
5-1-1 创建数据库
当use的时候,系统就会自动创建一个数据库。 如果use之后没有创建任何集合,系统就会删除这个数据库。
即必须在use 库之后必须进行库的一些表操作才能将库永久保存
5-1-2 删除数据库
如果没有选择任何数据库,会删除默认的test数据库
test> show dbslocal 0.000GBtest 0.000GB创建数据库test> use testswitched to db test删除数据库test> db.dropDatabase(){ "dropped" : "test", "ok" : 1 }5-2 集合(表)操作
5-2-1 创建集合的两种方式
方法1 db.createCollection('集合名')
admin> use appswitched to db appapp> db.createCollection('a'){ "ok" : 1 }app> db.createCollection('b'){ "ok" : 1 }show collections //查看当前数据下的所有集合a b show tables //查看当前数据下的所有集合a b db.getCollectionNames() //获取指定库下的集合[ "a", "b" ]方法2:当插入一个文档的时候,一个集合就会自动创建。
往test表内添加文档,json格式 db.test.insert({name:"zhangsan"}) 往stu表内添加文档,json格式 db.stu.insert({id:101,name:"zhangsan",age:20,gender:"m"}) show tables; db.stu.insert({id:102,name:"lisi"}) db.stu.insert({a:"b",c:"d"}) db.stu.insert({a:1,c:2}) 查询数据db.stu.find({}).pretty()db.stu.find({id:101}).pretty();> {> "_id" : ObjectId("5b470168cfdebc16a5a82a97"), - 自动生成的聚集索引链,PK> "id" : 101,> "name" : "zhangsan",> "age" : 20,> "gender" : "m"> }5-2-2 删除集合
app> use appswitched to db appapp> db.log.drop() //删除集合5-2-3 集合重命名
//把log改名为log1app> db.log.renameCollection("log1"){ "ok" : 1 }app> show collectionsa b clog1app5-2-4 批量插入数据
for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":newDate()})}
六、Mongodb数据查询总结
6-1 查询集合中的记录数
app> db.log.find() //查询所有记录
注:默认每页显示20条记录,当显示不下的的情况下,可以用it迭代命令查询下一页数据
设置每页显示数据的大小DBQuery.shellBatchSize=50; //每页显示50条记录app> db.log.findOne() //查看第1条记录app> db.log.count() //查询总的记录数6-2 删除集合中的记录数
app> db.log.remove({}) //删除集合中所有记录db.log.distinct("name") //查询去掉当前集合中某列的重复数据6-3 查看集合存储信息
app> db.log.stats()app> db.log.dataSize() //集合中数据的原始大小app> db.log.totalIndexSize() //集合中索引数据的原始大小app> db.log.totalSize() //集合中索引+数据压缩存储之后的大小app> db.log.storageSize() //集合中数据压缩存储的大小
七、用户管理操作
7-0 用户操作注意事项
!!!注意:验证库,建立用户时use到的库,在使用用户时,要加上验证库才能登陆。
对于管理员用户,必须在admin下创建.use admin mongo 10.0.0.51/admindb.createUser{ user: "", pwd: " ", roles: [ { role: " ", db: " " } | " ", ... ]} 基本语法说明
- user:用户名
- pwd:密码
- roles
- role:角色名
- db:作用对象,一般使用库;可使用多个对象,用|进行分割
- role:root, dbAdmin,readWrite,read - 常用的角色用户
验证数据库
mongo -u usertest -p 123 10.0.0.51/usertest总结
在创建普通用户时,一般事先use 到想要设置权限的库下;或者所有普通用户使用同一个验证库,比如test
root角色的创建,要在admin下进行创建
创建用户时你use到的库,在将来登录时候,使用以下方式登录,否则是登录不了的
7-1 用户管理实例
7-1-1 创建超级管理员:管理所有数据库(必须use admin再去创建)
$ mongouse admindb.createUser({ user: "root", pwd: "root123", roles: [ { role: "root", db: "admin" } ]})验证用户db.auth('root','root123')注意!!!:先创建用户在修改配置文件,开启验证功能配置文件中,加入以下配置 - 开启验证功能security: authorization: enabled重启mongodbmongod -f /mongodb/conf/mongo.conf --shutdown mongod -f /mongodb/conf/mongo.conf 登录验证mongo -uroot -proot123 admin - 本地登陆方式mongo -uroot -proot123 10.0.0.51/admin - 远程登陆方式或者mongouse admindb.auth('root','root123')查看用户:use admindb.system.users.find().pretty()7-1-2 创建库管理用户
mongo -uroot -proot123 adminuse appdb.createUser({user: "admin",pwd: "admin",roles: [ { role: "dbAdmin", db: "app" } ]})db.auth('admin','admin')登录测试mongo -uadmin -padmin 10.0.0.51/app7-1-3 创建对app数据库,读、写权限的用户app01
(1)超级管理员用户登陆mongo -uroot -proot123 admin(2)选择一个验证库use app(3)创建用户db.createUser( { user: "app01", pwd: "app01", roles: [ { role: "readWrite" , db: "app" } ] })(4)连接测试mongo -uapp01 -papp01 app7-1-4 创建app数据库读写权限的用户并对test数据库具有读权限
mongo -uroot -proot123 10.0.0.51/adminuse appdb.createUser({ user: "app03", pwd: "app03", roles: [ { role: "readWrite", db: "app" }, { role: "read", db: "test" } ]})7-1-5 查询mongodb中的用户信息
mongo -uroot -proot123 10.0.0.51/admindb.system.users.find().pretty()7-1-6 删除用户(root身份登录,use到验证库)
mongo -uroot -proot123 10.0.0.51/adminuse appdb.dropUser("app01")
转载地址:http://orlvn.baihongyu.com/