1 简介
mongobd是一种面向集合的文档性数据库,数据结构有键值对组成,字段数据类似json数据格式。
与关系数据库区别:不支持多表连接、不支持事务存储过程,不适合存储数据间关系复杂的数据。一般用作数据仓库。
2 安装
从https://www.mongodb.com/download-center#community官网下载。
通过cmd进入安装目录或者是解压目录。在目录下的bin目录有俩个可执行文件,分别是mongo.exe和mongod.exe。前者是启动客户端,后者是启动服务端。
在任意目录建立data\db,和data\db\log文件,用来存放数据可和日志。
启动服务:mongod –dbpathdata\db --logpath data\log –port 8888 ,设置服务端的数据库目录,日志目录,端口
然后重新打开命令行,进入安装目录,启动客户端。mongo localhost:8888
3 基本概念
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
4 数据库操作命令
use : 切换数据库,如果不存在就创建。
showdbs : 查看所有数据库
db : 当前数据库
db.dropDatabase(databaseName): 删除数据库
help : 全局范围帮助指令
db.help() : 数据库相关帮助指令
db.集合.help() : 集合相关帮助指令
5 集合操作命令
db.createCollection(name,options):创建集合,但一般不使用,当我们插入文档的时候会自动创建集合。
show collections: 显示当前数据库下所有集合
show tables : 显示所有集合,同上。
db.集合.drop(): 删除集合
6 文档操作命令
插入:
db.collection_name.insert(data):向集合插入文档,data为bson数据格式(json的扩展),也可以插入多条。”_id”每个文档都有的属性,类似于主键,是一个ObjectId对象,当插入数据的时候,“_id”重复会报错。当然类型也可以自己定义,只要不重复就行。
删除:
db.collection_name.remove(条件):删除文档,{“age”:10}这样表示删除age=10的文档。{“age”:{$gt : 10}} 表示删除age大于10的文档,如果条件为空,则删除全部。
常用操作符:$lt,$lte,$gt,$gte,$in,$nin,$or,$not
跟新:
db.collection_name.update():将符合条件的文档跟新为新文档
db.collection.update(<query>,<update>,
{
upsert: <boolean>, //如果不存在的话,是否插入
multi: <boolean>, //是否跟新多个
writeConcern: <document> //抛出异常的级别
}
)
也可是使用操作符,$set(只跟新指定字段)与$inc(增加指定字段)
db.col.update({age:{$gt:5}},{$set:{name:”haha”}},{multi:true})将年龄大于5的学生名字跟新为haha,并且是多条跟新
查询:
db.collection.find(query,projection):查询文档
db.col.find({$or:[{age:5},{age:6}]},{name:”haha”},{age:1}).sort({age:-1}).pretty():查询年龄是5岁或者是6岁的学生,并且名字为haha的学生,只显示年龄,并按照年龄降序排列。
projection 表示显示哪些列,1为只显示该字段,0为除了该字段都显示
sort:1位正序,-1位倒序
pretty:将查询结果美化
_id:默认显示,如果想隐藏,只能显示指定
skip:从第几条数据开是显示
limit:显示几条,和skip组合使用可以实现分页
聚集函数:
db.collection.count(query): 统计总数
7 权限管理(3.0后)
mongodb中用户是属于数据库的,每个数据库都有自己的管理员,只能管理所属数据库。3.0前和3.0后的有所不同。
创建用户:首先需要在admin库中创建管理员,再在对用库中创建管理员。
> use admin
switched to dbadmin
>db.createUser(
... {
... user: "root",
... pwd: "root",
... roles: [ { role: "root", db:"admin" } ]
... }
... )
Built-In Roles(内置角色):
1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root
// 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 内部角色:__system
然后再在指定库中创建即可。
关闭服务,重新启动服务。在服务的启动上加上—auth,表示开启权限验证
启动客户端,进入指定数据库,db.auth(username,pwd)来进行登录。
删除用户:每个用户都会在admin下的sys.user集合中存在文档,所以想要删除用户只需删除admin库下的sys.user集合中的文档。或者使用db.dropUser(username)来删除。
8 索引
索引建立:db.colleciton.ensureIndex({key1:1,key2:1},{option})
可以是一个索引,也可以是复合索引,1表示升序创建索引,-1表示降序;也可以使用参数变为唯一索引。{unique:true}
查看索引:db.collection.getIndexes()
删除索引:db.collection.dropIndex({name:1})
db.collection.dropIndexes() 删除所有索引
重建索引:db.collection.reIndex()
分析语句:db.collection.find().explain(option)option可以为:”queryPlanner”, “executionStats”, 和”allPlansExecution”
9 数据导入导出
导出:mongoexport -h dbhost -d dbname -ccollectionName -o output –u name –p password
-h 数据库地址
-d 指明使用的库
-c 指明要导出的集合
-o 指明要导出的文件名(文件支持多种格式,如txt,wps,xls等)
-u 此数据库的用户名
-p 此数据库的的密码
导入:mongoimport-h dbhost -d dbname -c collectionname input –u name –p password
input 是文件路径
10 主从复制
设置一个主服务器(master)和多个从服务器,主服务器负责修改,从服务器负责查询。并且主服务器的每个修改都会同步到从服务器。这样避免了以前表锁导致的线程阻塞。实现读写分离。
11 Java操作mongodb
MongoClientmongoClient = new MongoClient( "localhost" , 27017 );
// 连接到数据库
MongoDatabase mongoDatabase= mongoClient.getDatabase("mycol");
System.out.println("Connectto database successfully");
mongoDatabase.createCollection("test");
System.out.println("集合创建成功");