一、MongoDB简介
MongoDB是一种强大、灵活、可扩展的数据存储方式。它扩展了关系型数据库的众多有用功能,如辅助索引、范围查询(range query)和排序。MongoDB的功能非常丰富,比如内置的对MapReduce式聚合的支持,以及对地理空间索引的支持。要是不能用的话,再牛的技术也是空谈,MongoDB致力于容易上手、便于使用。MongoDB的数据模型对开发者来说非常友好,配置选项对于管理员来说也很轻松,并且有驱动程序和数据库shell提供的然语言式的API。MongoDB会为你扫除障碍,让你关注编程本身而不是为存储数据烦恼。
百度的简介:
mongodb是一个基于分布式文件存储的数据库,由C++语言编写。
它旨在为WEB应用提供可扩展的高性能数据存储解决方案,最大的特点是支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
一个介于关系数据库和非关系数据库之间的产品
丰富的数据模型
MongoDB是面向文档的数据库,不是关系型数据库。放弃关系模型的主要原因就是为了获得更加方便的扩展性,当然还有其他好处。
基本的思路就是将原来“行”(row)的概念换成更加灵活的“文档”(document)模型。面向文档的方式可以将文档或者数组内嵌进来,所以用一条记录就可以表示非常复杂的层次关系。使用面向对象语言的开发者恰恰这么看待数据,所以感觉非常自然。MongoDB没有模式:文档的键不会事先定义也不会固定不变。由于没有模式需要更改,通常不需要迁移大量数据。不必将所有数据都放到一个模子里面,应用层可以处理新增或者丢失的键。这样开发者可以非常容易地变更数据模型。
容易扩展
应用数据集的大小在飞速增加。传感器技术的发展、带宽的增加,以及可连接到因特网的手持设备的普及使得当下即便很小的应用也要存储大量数据,量大到很多数据库都应付不来。T级别的数据原来是闻所未闻的,现在已经司空见惯了。由于开发者要存储的数据不断增长,他们面临一个非常困难的选择:该如何扩展他们的数据库?升级呢(买台更好的机器),还是扩展呢(将数据分散到很多机器上)?升级通常是最省力气的做法,但是问题也显而易见大型机一般都非常昂贵,最后达到了物理极限的话花多少钱都买不到更好的机器。对于大多数人希望构建的大型Web应用来说,这样做既不现实也不划算。而扩展就不同了,不但经济而且还能持续添加:想要增加存储空间或者提升性能,只需要买台一般的服务器加入集群就好了。MongoDB从最初设计的时候就考虑到了扩展的问题。它所采用的面向文档的数据模型使其可以自动在多台服务器之间分割数据。它还可以平衡集群的数据和负载,自动重排文档。这样开发者就可以专注于编写应用,而不是考虑如何扩展。要是需要更大的容量,只需在集群中添加新机器,然后让数据库来处理剩下的事。
丰富的功能
很难界定什么才算作一个功能:上面提及的算是功能吗?关系型数据库做不到的算吗?都可以说Memcached 做不到的呢?其他面向文档的数据库做不到的又如何呢?但无论界定的标准是什么,都可以说MongoDB拥有一些真正独特的、好用的工具,其他方案不具备或不完全具备这些工具。
索引
MongoDB支持通用辅助索引,能进行多种快速查询,也提供唯-一的、复合的和地理空间索引能力。
存储JavaScript
开发人员不必使用存储过程了,可以直接在服务端存取JavaScript的函数和值。
聚合
MongoDB支持MapReduce和其他聚合工具。
固定集合
集合的大小是有上限的,这对某些类型的数据(比如日志)特别有用。
文件存储
MongoDB支持用一种容易使用的协议存储大型文件和文件的元数据。有些关系型数据库的常见功能MongoDB并不具备,比如联接(join)和复杂的多
行事务。这个架构上的考虑是为了提高扩展性,因为这两个功能实在很难在一个分布式系统上实现。
不牺牲速度
卓越的性能是MongoDB的主要目标,也极大地影响了设计上的很多决定。MongoDB使用MongoDB传输协议作为与服务器交互的主要方式(与之对应的协议需要更多的开销,如HTTP/REST)。它对文档进行动态填充,预分配数据文件用空间换取性能的稳定。默认的存储引擎中使用了内存映射文件,将内存管理工作交给操作系统去处理。动态查询优化器会“记住”执行查询最高效的方式。总之,MongoDB在各个方面都充分考虑了性能。虽然MongoDB功能强大,尽量保持关系型数据库的众多特性,但是它并不是要具备所有的关系型数据库的功能。它尽可能地将服务器端处理逻辑交给客户端(由驱动程序或者用户的应用程序处理)。这样精简的设计使得MongoDB获得了非常好的性能。
简便的管理
MongoDB尽量让服务器自治来简化数据库的管理。除了启动数据库服务器之外,几乎没有什么必要的管理操作。如果主服务器挂掉了,MongoDB会自动切换到备份服务器上,并且将备份服务器提升为活跃服务器。在分布式环境下,集群只需要知道有新增加的节点,就会自动集成和配置新节点。MongoDB的管理理念就是尽可能地让服务器自动配置,让用户能在需要的时候调整设置(但不强制)。
其他内容
在本书中,我们还会花些时间追溯一下在开发MongoDB的过程中一些决定的原因和动机,希望通过这种方式来阐释MongoDB的理念.毕竟,MongoDB的愿景是对自身最好的诠释–建立一种灵活、高效、易于扩展、功能完备的数据库.
二、MongoDB的基础知识
mongodb安装包与Studio-3T工具:
链接:https://pan.baidu.com/s/1anTFjxjWMz3TQW1P_H9wJg
提取码:k779
具体安装和激活过程请百度吧(^_−)☆
三、MongoDB的简单使用
1、连接mongodb
mongodb的使用方式是客户服务器模式,即使用一个客户端连接mongodb数据库(服务端)。
(1)、命令格式
mongodb://[username:password@]host1[ :port1][,host2[ :port2],… .[ ,hostN[ :portN]]][/[database][?options]]
mongodb://固定前缀
username:账号,可不填
password:密码,可不填
host:主机名或ip地址,只有host主机名为必填项。
port:端口,可不填,默认27017
/database:连接某一个数据库
?options:连接参数,key/value对
例子∶
mongodb://localhost连接本地数据库27017端口
mongodb: / /root:itcast@localhost使用用户名root密码为itcast连接本地数据库27017端口
mongodb://localhost,localhost:27018,localhost:27019,连接三台主从服务器,端口为27017、27018、27019
(2)、MongoDB的连接
I 、使用mongodb自带的javascript shell(mongo.exe)连接
进入MongoDB下的bin目录,启动mongo.exe:
咦!!!报错了,啥也别说,百度就对了,查找完后就有了如下解决操作:
在该目录下创建一个mongo.config文件,并配置相对应的内容:
然后就可以启动该文件了,注意:启动后,不能关闭,要一直开着
最后就可以继续一开始报错的操作了
这样就启动成功啦(~ ̄▽ ̄)~
II、Studio-3T连接
上面的连接是使用客服端工具连接的,下面便是用Studio-3T工具进行连接:
这又是什么鬼,居然连接失败了,以刚才的经验,不用想启动mongo.config文件
具体为啥我就没探究了,如果你知道希望可以告诉我[]( ̄▽ ̄)*
III、Java连接
详细参数:http://mongodb.github.io/mongo-java-driver/3.4/driver/tutorials/connect-to-mongodb/
添加依赖pom.xml:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo‐java‐driver</artifactId>
<version>3.4.3</version>
</dependency>
测试程序:
public class testMongoDB {
@Test
public void testConnection() {
//创建mongodb客服端
MongoClient mongoClient = new MongoClient("localhost", 27017);
//或者采用了解字符串
/*
MongoClientURL connectionString = new MongoClientURL("mongodb://root:root@localhost:27017");
MongoClientURL mongoClient = new MongoClient(connectionString);
*/
//连接数据库
MongoDatabase database = mongoClient.getDatabase("test");
//连接collection
MongoCollection<org.bson.Document> collection = database.getCollection("student");
//查询第一个文档
Document myDoc = collection.find().first();
//得到文件内容json串
String json = myDoc.toJson();
System.out.println(json);
}
}
以上便是连接mongodb数据库的三种方式,既然连接成功了我们便进行操作mongodb数据库
(3)、操作数据库
1、查询数据库
show dbs 查询全部数据库
db 显示当前数据库
2、创建数据库
命令格式:
use DATABASE_NAME
例子: use test02 有test02数据库则切换到此数据库,没有则创建。
注意: 新创建的数据库不显示,需要至少包括一个集合。
3、删除数据库(慎用!!!)
命令格式:
例子: 删除test02数据库
先切换数据库: use test02
再执行删除: db.dropDatabase()
集合
集合相当于关系数据库中的表,一个数据库可以创建多个集合,一个集合是将相同类型的文档管理起来。
1、创建集合
db.createCollection(name, options)
name: 新创建的集合名称
options: 创建参数
2、删除集合
db.collection.drop()
例子: db.student.drop() 删除student集合
以上便是使用mongodb自带的javascript shell(mongo.exe)连接与简单操作,当然直接使用Studio-3T操作起来更加简便。
2、文档
文档是MongoDB的核心概念。多个键及其关联的值有序地放置在一起便是文档。每种编程语言表示文档的方法不太一样,但大多数编程语言都有相通的–种数据结构,比如映射、散列或字典。例如,在JavaScript里面,文档表示为对象:
{“greeting” : “Hello,world!”}
这个文档只有一个键"greeting",其对应的值为"Hello, world!"。绝大多数情况下,文档会比这个简单的例子复杂得多,经常会包含多个键/值对:
{“greeting” : “Hello, worldl” ,“num” : 520}
(1)、插入文档
mongodb中文档的格式是json格式,下边就是一个文档,包括两个key:_id主键和name
{
"_id" : ObjectId("5f6ee646b5e817fb96ffe5d1"),
"name" : "一个爱运动的程序员"
"age":20
}
插入命令:
db.COLLECTION_NAME.insert(document)
每个文档默认以_id作为主键,主键默认类型为ObjectId(对象类型),mongodb会自动生成主键值。
例子:
db.student.insert({“name”:“一个爱运动的程序员”,“age”:20})
在Studio-3T中查看:
注意: 同一个集合中的文档的key可以不相同!但是建议设置为相同的。
(2)、更新文档
命令格式:
db.collection.update(
<query>,
<update>,
<options>
)
query: 查询条件,相当于sql语句的where
update: 更新文档内容
options: 选项
I、替换文档
将符合条件 “name”:"一个爱运动的程序员"的第一个文档替换为{“name”:“猪头”,“age”:20}。
db.student.update({“name”:“一个爱运动的程序员”},{“name”:“猪头”,“age”:20})
II、$set修改器
使用$set修改器指定要更新的key,key不存在则创建,存在则更新。 将符合条件 “name”:"猪头"的所有文档更新name和age的值。
db.student.update({“name”:“一个爱运动的程序员”},{$set:{“name”:“猪头”,“age”:20}},{multi:true})
multi:false表示更新第一个匹配的文档,true表示更新所有匹配的文档。
(3)、删除文档
命令格式:
db.student.remove()
query:删除条件,相当于sql语句中的where
I、删除所有文档
db.student.remove({})
II、删除符合条件的文档
db.student.remove({“name”:“猪头”})
(4)、查询文档
命令格式:
db.collection.find(query, projection)
query:查询条件,可不填
projection:投影查询key,可不填
I、查询全部
db.student.find()
II、查询符合条件的记录
查询name等为"猪头"的文档。
db.student.find({“name”:“猪头”})
III、投影查询
只显示name和age两个key,_id主键不显示。
db.student.find({“name”:“猪头”},{name:1,age:1,_id:0})
而在Studio-3T里的查询:
3、用户
前面的操作,我们是没有进行认证登录的
(1)、创建用户
语法格式:
mongo>db.createUser(
{ user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
]}
)
例子:
创建root用户,角色为root
use admin
db.createUser(
{
user:"root",
pwd:"123456",
roles:[{role:"root",db:"admin"}]
}
)
在Studio-3T查看:
内置角色如下:
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 备份恢复角色:backup、restore;
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、 dbAdminAnyDatabase
- 超级用户角色:root
(2)、认证登录
为了安全需要,Mongodb要打开认证开关,即用户连接Mongodb要进行认证,其中就可以通过账号密码方式进行 认证。
1、在mongo.conf中设置 auth=true
2、重启Mongodb
3、使用账号和密码连接数据库
1)mongo.exe连接
mongo.exe ‐u root ‐p 123456 ‐‐authenticationDatabase admin
2)Studio 3T连接
(3)、查询用户
查询当前库下的所有用户:
show users
(4)、删除用户
语法格式:
db.dropUser(“用户名”)
例子:
删除test1用户
db.dropUser(“test1”)
(5)、修改用户
语法格式:
db.updateUser(
"<username>",
{
customData : { <any information> },
roles : [
{ role: "<role>", db: "<database>" } | "<role>",
...
],
pwd: "<cleartext password>"
},
writeConcern: { <write concern> })
例子:
先创建test1用户:
db.createUser(
{
user:"test1",
pwd:"test1",
roles:[{role:"root",db:"admin"}]
}
)
修改test1用户的角色为readWriteAnyDatabase
use admin
db.updateUser(“test1”,{roles:[{role:“readWriteAnyDatabase”,db:“admin”}]})
(6)、修改密码
语法格式:
db.changeUserPassword(“username”,“newPasswd”)
例子:
修改test1用户的密码为123
use admin
db.changeUserPassword(“test1”,“123”)
以上便是关于MongoDB数据库的简单基础入门ヾ(◍°∇°◍)ノ゙