1
.mongoDB数据库(NoSQL数据库)
1.1
安装(windows版本)
a.下载链接 www.mongodb.org
b.创建一个目录用于存放安装目录,解压安装包
c.创建一个目录用于存放数据
d.cd到安装目录 进入bin 执行 mongod.exe --dbpath 数据目录全路径
e.配置环境变量
f.启动数据库服务 自己修改mongodb.bat
mongod --dbpath
"d:/mongodb_data"
g.参考文档配置启动命令选项
h.客户端连接
mongo
127.0
.
0.1
:
27017
(如果不改变端口,默认为
27017
)/admin(使用管理员登陆)
1.2
shell基本操作
1.2
.
1
对比
和关系型数据库差异
对比项 mongodb MySQL
表 集合 table
行 文档 行记录
字段 键key 字段field
值 值value 值value
主外键 无 PK,FK
灵活性 极高 差
查询 find sql
1.2
.
2
基本操作
1
.创建数据库
use 数据库名(如果此时什么都不干,离开时这个空数据库会从缓存中删除)
2
.查看所有数据库
show dbs
3
.给指定的数据库添加集合并添加记录
db.persons.insert({name:
"test"
})
//此条命令执行完以后会自动为文档插入id一列
其中:
db 表示所使用的数据库
persons 表示集合
insert 表示集合操作
name 表示key
test 表示value
4
.查看数据库中的所有文档
show collections
5
.查询指定文档的数据
a.查询所有
db.persons.find()
b.查询一条数据
db.persons.findOne()
//查询一行数据
6
.更新文档数据
db.persons.update({name:
"test"
},{$set:{name:
"test1"
}})
//满足条件多条记录时,只更新第一条
//第一个{} 表示条件
//第二个{} 表示需修改的字段
7
.删除文档数据
db.persons.remove({name:
"123"
})
//{} 条件
8
.删除库中的集合
db.persons.drop()
9
.删除数据库
db.dropDatabase()
10
.shell的help
db.help()
//全局数据库帮助
db.person.help()
//集合相关帮助
11
.API
http:
//api.mongodb.org/
12
.命名规范
1
.不能是空字符串
2
.特殊符号不能使用
3
.应全部小写
4
.最多
64
字节
5
.不能跟现有的数据同名 如admin local
13
.可充当js引擎,可以执行js命令
1.3
BSON扩充的数据类型
1
.概述
BSON:是JSON的扩展,它新增了日期和浮点等JSON不支持的数据类型
1.4
MongoVUE————可视化工具
一开始不推荐 后期可查看相关命令
1.5
文档数据
1
.插入
a.插入
db.文档.insert.({key:value})
b.批量插入
shell不支持批量插入,只能使用
for
循环
for
(var i=
0
; i<
10
; i++){
db.perosns.insert({name:i})
}
c.save操作
save操作和insert操作的区别在于当遇到相同id情况下时:
save完成保存操作,而insert则报错
2
.删除
a.删除列表中所有数据
db.persons.remove()
b.根据条件删除数据
db.persons.remove({naem:
1
})
3
.更新
a.强硬式文件替换
db.persons.update({查询器},{修改器})
//会导致新文档替换旧文档 新文档为修改器里面的内容
b.主键冲突会报错并停止更新操作
当更新文档和已有文档ID冲突时则系统报错
c.insertOrUpdate操作
查询器查出来的数据则执行更新操作,否则执行替换操作
db.persons.update({查询器},{修改器},
true
)
d.批量更新操作(解决只更新一条数据问题)
db.persons.update({查询器},{修改器},
false
,
true
)
//查询器多条记录时均更新
e.更新器
$set————用来指定一个键值对,存在则修改,不存在则添加
{$set:{key:value}}
$inc————用来指定的键对应的数字类型的数值进行加减操作
{$inc:{field:
1
}}
//field这个列的数值+1 如果减1则是-1
$unset————用来删除指定键
{$unset:{field:value}}
$push————如果指定的键是数组则追加数值;如果指定键不存在则创建数组类型的键值对
{$push:{filed:value}}
$pushAll————用法和push差不多
{$pushAll:{field:array}}
//注意后面跟着是数组
$addToSet————用于添加键,如果存在则不操作
{$addToSet:{field:value}}
$pop————从指定数组中删除一个值
{$pop:{filed:value}}
//其中value为1时代表最后一个数值,-1为第一个数值
$pull————删除一个被指定的数值
{$pull:{
"name"
:
"test"
}}
$pullAll————一次性删除多个指定的数值
{$pullAll:{
"name"
:[
"test"
,
"test1"
,
"test2"
]}}
$————数组定位器
4
.查询
a.Find
1
.指定返回的键
db.persons.find({},{})
//第一个{}指定条件
//第二个{}指定需要返回的列
//其中id列默认情况下会返回 _id:0为不返回 name:1为返回那么列
2
.查询条件
$lt -> < $lte -> <=
$gt -> > $gte -> >=
$ne -> !=
$in
$nin
$or
Null
$elemMatch ————数组查询器
$where ————尽量避免使用。性能低
示例:
22
<=age<=
27
-> {age:{$gte:
22
,$lte:
27
}}
age !=
26
-> {age:{$ne:
26
}}
age in(
12
,
13
) -> {age:{$in:[
12
,
13
]}} --后接数组
age>
80
or age<
40
-> {$or:[{age:{$gt:
80
}},{age:{$lt:
40
}}]}
age is
null
-> {age:{$in:[
null
]}}
b.分页和排序
1
.分页
前几条数据 ————limit()
db.persons.find().limit(
5
) --查询前
5
条数据
前跨度数据 —————skip()
db.persons.find().limit(
3
).skip(
5
) --前
6
~
8
共三条 前面
5
条省略跳过
2
.排序 ————sort()
db.persons.find().limit(
3
).sort({name:
1
}) --前三行数据根据name升序排序 -
1
为倒序
db.persons.find().limit(
3
).sort({name:
1
,age:-
1
}) --先升序再倒序
c.游标和其他知识
1
.游标
var p = db.persons.find(); --得到游标
while
(p.hasNext()){ --遍历游标
obj = p.next(); --指向下一条记录
PRint(obj)
}
2
.游标销毁的条件
1
.客户端发来请求销毁
2
.迭代完毕
3
.超过
10
分钟没用,自动清除
3
.查询快照————针对不变的集合进行游标运动
高级查询选项:
$query:doc doc 为字段 (field:value)
$orderby:doc
$maxsan:integer 做多扫描文档个数
$min:doc 查询开始
$max:doc 查询结束
$hint:doc 使用哪个索引
$explain:
boolean
统计
$snapshot:
boolean
快照
示例:db.persons.find({$query:{name:
"jim"
},$snapshot:
true
},{_id:
0
})
1.6
常用函数
a.findAndModify函数————返回集合
b.runCommand函数————返回更新或者删除的文档
示例:
ps = db.runCommand({
"findAndModify"
:
"persons"
,
"query"
:{name:
"test"
},
"update"
:{
"$set"
:{
"age"
:
11
}},
"new"
:
true
}).value
--
"findAndModify"
集合名
--
"query"
查询器
--
"update"
修改器
--
"new"
状态--如果
true
表示返回结果是更新后的,
false
为更新前
--
"sort"
排序
c.Count函数————计数
db.persons.find({country:
"USA"
}).count() --查询美国国籍的人数
d.Distinct函数————去重
db.runCommand({distinct:
"persons"
,key
"country"
}).values --查询persons集合中一共有多少个国家,分别是什么
e.Group函数————分组
db.runCommand({
group:{
ns:集合名字,
Key:分组的键对象,
Initial:初始化累加器,
$reduce:组分解器,
Condition:条件,
Finalize:组完成器
}
})
说明:分组首先会按照key进行分区,每组的每个文档全部要执行$reduce的方法,其中参数为:一个是组内本条记录,一个是累加器数据
示例:
db.runCommand({
group:{
ns:
"persons"
,
key:{
"country"
:
true
},
initial:{m:
0
},
$reduce:function(doc,prev){
if
(doc.m > prev.m){
prev.m = doc.m;
prev.name = doc.name;
prev.country = doc.country;
}
},
condition:{m:{$gt:
90
}}
}
})
f.列出所有函数
1
.shell方式
db.listCommands()
2
.WEB方式
http:
//localhost:28017/_commands //注意启动时需要加--rest 如: mongod --dbpath 数据目录 --rest
1.7
索引
a.索引概述
1
.创建索引的时候注意正序还是倒序
2
.索引的创建在提高查询性能的同时会影响插入性能
3
.符合索引要注意索引的先后顺序
4
.每个键全建立索引不一定就能提高性能
b.管理索引
1
.创建索引
db.persons.ensureIndex({id:
1
},{unique:
true
})
id为索引列
1
为升序 -
1
为倒序
unique 为唯一索引
2
.删除索引
db.runCommand({dropIndexs:
"persons"
,index:
"index_name"
}) 将persons的index_name索引删除
db.runCommand({dropIndexs:
"persons"
,index:
"*"
}) 将persons的所有索引删除
c.空间索引————二维空间索引,地图时用到,具体找度娘
1.8
固定集合
1
.特性
a.固定集合默认是没有索引的,就算是_id也是没有索引的
b.由于不要分配新的空间,所以插入速度非常快
c.固定集合的顺序是确定的,所以查询速度非常快
d.最适合的是应用就是日志管理
2
.操作
a.创建一个名叫mycoll的固定集合要求大小在
100
个字节,可以存储
10
个文档
db.createColletion(
"mycoll"
,{size:
100
,capped:
true
,max:
10
})
b.把一个普通的集合转换成固定集合
db.runCommand({convertCapped:
"persons"
,size=
10000
})
c.反向排序,默认是插入顺序排序
db.mycoll.find().sort({$natural:-
1
})
1.9
GridFS
1
.简述
GridFS是mongoDB自带的文件系统,使用二进制的形式存储文件
2
.利用的工具
mongofile.exe
3
.使用
a.查看GridFS的所有功能
cmd -> mongofiles
b.上传一个文件
mongofiles -d 数据库名 -l
"E:/t.txt"
put
"a.txt"
c.集合查看存储文件的信息
db.fs.chunks.find()
db.fs.files.find()
d.集合中所有文件
mongofiles -d 数据库名 list
1.10
其他脚本
1
.服务器端运行eval
db.eval(
"function(name){return name}"
,
"test"
)
2
.js的存储
a.在服务上保存js变量供给函数全局调用
db.system.js.insert({_id:name,value:
"test"
})
//保存变量name
db.eval(
"{return name;}"
)
//调用变量 注意变量名必须定义。不然报错
//其中js相当于关系型数据库中的存储过程,因为value值可以为函数
1.11
运维管理
1
.启动配置
--dbpath 指定数据库目录 默认情况下在c:/data/db
--port 监听端口 默认情况下是
27017
--fork 用守护进程方式启动mongoDB
--logpath 指定日志输出目录 默认是控制台
--config 指定启动项用文件的路径
--auth 用安全认证方式启动数据库
示例:
1
.使用config配置文件来启动数据库,将启动端口改为
8888
mongodb.conf文件(安装目录下)
dbpath=D:/data
port=
8888
--启动命令
mongod.exe --config ../mongodb.conf
--客户端连接命令
//如果是在shell下操作 命令是mongo 127.0.0.1:8888
2
.停止数据库服务
a ctrl+c组合键
b admin数据库命令关闭
use admin
db.shutdownServer()
2
.导入/导出
a 导入数据
使用mongoimport命令
参数有
--db 指定数据库
--collection 指定集合
--file 指定文件
--host 指定主机
--port 指定端口
示例:
mongoimport --db test --collection person --file
"D:/t.txt"
b 导出数据
使用mongoexport命令
参数有
-d 指定数据库
-c 指定集合
-o 指定输出文件
-csv 导出csv格式
-q 过滤导出
--type<json|csv|tsv>
--host 指定主机
--port 指定端口
示例:
1
.导出本机
mongoexport -d persons -c person -o
"D:/t.txt"
2
.导出其他主机
mongoexport --host hadoop --port
8888
c 备份/恢复
1
.运行时备份 mongodump
示例: mongodump --host
127.0
.
0.1
:
27017
-d test -o
"d:/bak"
--会根据数据库新建同名文件夹
2
.运行时恢复 mongorestore
示例: mongorestore --host
127.0
.
0.1
:
27017
-d test -directoryperdb
"d:/bak/test"
3
.懒人备份 直接将数据文件拷贝
3
.锁
a Fsync使用
数据库结构图:
读写操作->缓冲池->数据库 (从上到下)
上锁:将缓冲池的数据全部写进数据库中
示例:
use admin --选择需要上锁数据库
db.runCommand({fsync:
1
,lock:
1
}); --上锁
解锁:当上锁操作完成后的操作
示例:db.currentOp()
数据修复:数据库自我修复的能力
示例:
use admin --选择需要修复数据库
db.repairDatabase()
4
.用户管理
在启动时需启动安全检查 --auth
a 添加用户
use admin --选择需要添加用户的数据库
db.addUser(
"root"
,
"passWord"
); --参数为用户名和密码
//其中admin数据库中的用户为管理员用户
b 启用用户
db.auth(
"用户名"
,
"密码"
);
c 删除用户
db.system.users.remove({user:
"root"
}); --删除用户名为root的用户
1.12
主从架构
a 主从复制————一个简单的数据库同步备份的集群技术
1.1
在数据集群中要明确的知道谁是主服务器,主服务器只有一台
1.2
从服务器要知道自己的数据源,也就是对于主服务器是谁
1.3
--master用来确定主服务器
--slave和-source来控制从服务器
示例:
1
台主服务器配置文件
dbpath=数据库目录
port=
8888
--端口
bind_ip=
127.0
.
0.1
--绑定IP地址
master=
true
--主服务器标识
1
台从服务器配置文件
dbpath=数据库目录
port=
7777
--端口 可跟主服务器一样也可不一样,建议不一样
source=
127.0
.
0.1
:
8888
--指向主服务器
slave=
true
--从服务器标识
1.4
主从复制的其他设置项
--only 指定复制某个数据库,默认为全部数据库 从服务器端设置
--slavedelay 设置主数据库同步数据的延迟(单位为秒) 从服务器端设置
--fastsync 以主数据库的节点快照为节点启动从数据库 从服务器端设置
--autoresync 如果不同步则重新同步数据库 从服务器端设置
--oplogsize 设置oplog的大小(主节点操作记录存储在local的oplog中) 主服务器端设置
1.5
动态添加和删除从节点
添加: db.sources.insert({
"host"
,
"192.168.1.100:9999"
}) --添加一个新的从节点
删除: db.sources.remove({
"host"
,
"192.168.1.100:9999"
}) --删除一个从节点
b 副本集————主从分布式
假设有个集群,三台服务器,分别是ABC,其中A为主服务器,BC为从服务器
1
当A活跃时,BC用于备份
2
当A出现故障时,B变成活跃
3
当A再恢复后,此时AC变成备份服务器,B为主服务器
4
插入更新查询操作只能在活跃节点上执行,备份节点只能备份
示例:
第一步:修改服务器配置文件
A服务器配置文件
dbpath=数据库目录
port=
1111
bind_ip=
127.0
.
0.1
replSet=child/
127.0
.
0.1
:
2222
--设定同伴
B服务器配置文件
dbpath=数据库目录
port=
2222
bind_ip=
127.0
.
0.1
replSet=child/
127.0
.
0.1
:
3333
--设定同伴
C服务器配置文件
dbpath=数据库目录
port=
3333
bind_ip=
127.0
.
0.1
replSet=child/
127.0
.
0.1
:
1111
--设定同伴
第二步:初始化副本集(在主服务器上设置)
use admin
db.runCommand({
"replSetInitiate"
:
{
"_id"
:
'child'
,
"members"
:[
{
"_id"
:
1
,
"host"
:
"127.0.0.1:1111"
},
{
"_id"
:
2
,
"host"
:
"127.0.0.1:2222"
},
{
"_id"
:
3
,
"host"
:
"127.0.0.1:3333"
}
]
}
})
第三步:查看副本集
rs.status()
节点参数:
standard 常规节点 参与投票 可能成为活跃节点
passive 副本节点 参与投票 不能成为活跃节点
arbiter 仲裁节点 参与投票 不能成为活跃节点
Priority 权重
0
~
1000
其中
0
表示副本节点,
1
~
1000
表示常规节点
arbiterOnly:
true
--表示仲裁节点
1.13
分片
1
.使用步骤(一台配置服务器,一台路由器,两台数据库)
1.1
创建一个配置服务器
mongod --config 配置服务器.conf
1.2
创建路由服务器,并连接到配置服务器
路由器调用mongos命令
1.3
添加
2
个分片数据库
8081
和
8082
1.4
利用路由器为集群添加分片(允许本地访问)(在路由器服务器执行)
db.runCommand({addshard:
"127.0.0.1:8081"
,allowLocal:
true
})
db.runCommand({addshard:
"127.0.0.1:8082"
,allowLocal:
true
})
//其中数据库之前不能使用任何数据库语句
1.5
打开数据库分片功能(在路由器服务器执行)
db.runCommand({
"enablesharding"
:
"数据库名"
})
1.6
对集合进行分片
db.runCommand({
"shardcollection"
:
"数据库名.集合名"
,
"key"
:{
"_id"
:
1
}})
1.7
查看集群中的所有分片
db.shards.find()
1.14
javaAPI
1
.导入jar包
2
.建立一个mongo的数据库连接对象
Mongo mo =
new
Mongo(
"127.0.0.1:8888"
); 默认是
127.0
.
0.1
:
27017
3
.查询所有的数据库名字
mo.getDataBaseNames();
4
.创建相关数据库的连接
DB db = mo.getDB(
"数据库名"
);
5
.查询数据库所有的集合名字
db.getCollectionNames();
6
.创建相关集合连接
DBCollection c = db.getCollection(
"集合名"
);
7
.查询集合所有数据
DBCursor cur = c.find();
//遍历指针
while
(cur.hasNext()){
DBObject o = cur.next();
System.out.println(NameValue:
" + o.get("
name"));
//得到name字段值
}
8
.其他操作
cur.count();
//个数
JSON.serialize(cur);
//转换Json对象
9
.新建集合操作
db.createCollection(
"集合名"
,
new
DBObject());
//如果没有new DBObject()不操作集合退出的話,集合会从缓存中销毁
10
.插入集合数据操作
DBObject doc =
new
BasicDBObject();
doc.put(
"name"
,
"test"
);
doc.put(
"age"
,
12
);
List<String> books =
new
ArrayList<String>();
books.add(
"MongoDB"
);
books.add(
"Java"
);
books.add(
"SQL"
);
doc.put(
"books"
,books);
c.insert(doc); --当传入参数类型是list时则是批量插入
11
.删除操作
c.remove(
new
BasicDBObject(
"_id"
,
new
ObjectId(id))) --根据Id删除 因为集合中的ID是ObjectId类型
12
.更新操作
c.update(find,update,upsert,multi)
--find 查询器
--update 更新器
--upsert 更新或者插入
true
/
false
--multi 是否批量
true
/
false
13
.分页操作
c.find().limit(
5
).skip(
3
); 每页
5
条,从第四条开始时(含第四条)
14
.排序操作
c.find.sort();
15
.关闭对象
c.close();
db.close();
转载于http://www.CUOXin.com/ciade/
新闻热点
疑难解答