NOSQL:非关系型数据库
特性
读写速度特别快
原因内存映射机制:先将数据写入内存,写入完成后通过异步方式将内存中的数据写入文档中
查询部分使用频率较高的数据还停留在内存中。所需空间特别大数据无规则
每一条数据都可以随意添加减少属性
支持主从复制
支持主从复制实现数据同步,故可以实现读写分离。自带监察模式,主服务器出现问题,自动在从如曲奇中选择一个服务器作为主服务器
支持数据分片
支持分布式存储
不受SQL注入影响
适合储存的数据
由于mongodb不支持事务处理,因此不适合存储业务逻辑比较强的数据
适合存储数据量比较大,当时价值比较低的数据
Linux安装
解压进入编译目录
1
2
3
4
5[root@localhost mongodb]# tar zxvf mongodb-linux-i686-rhel57-2.3.0.tgz -C /usr/local
[root@localhost local]# cd /usr/local/
[root@localhost local]# pwd
/usr/local创建软链接或改名
1
2[root@localhost local]# ln -sv mongodb-linux-i686-rhel57-2.3.0/ mongodb
"mongodb" -> "mongodb-linux-i686-rhel57-2.3.0/"进入到mongodb目录
[root@localhost local]# cd mongodb
创建数据存储目录及日志文件
[root@localhost mongodb]# mkdir data
[root@localhost mongodb]# touch log.log
启动mongodb
1
2
3
4
5[root@localhost mongodb]# cd bin
[root@localhost bin]# ./mongod --logpath=/usr/local/mongodb/log.log --dbpath=/r/local/mongodb/data/ --fork
[root@localhost bin]# netstat -tunple | grep 27017
tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 0 15697 2571/./mongod
--fork
后台启动
使用配置文件启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14[root@localhost bin]# pkill mongo
[root@localhost mongodb]# pwd
/usr/local/mongodb
[root@localhost mongodb]# vim mongo.conf
logpath=/usr/local/mongodb/log.log
dbpath=/usr/local/mongodb/data/
fork = true
[root@localhost mongodb]# ./bin/mongod -f /usr/local/mongodb/mongo.conf
forked process: 2662
all output going to: /usr/local/mongodb/log.log
log file [/usr/local/mongodb/log.log] exists; copied to temporary file [/usr/local/mongodb/log.log.2016-11-18T21-15-30]
child process started successfully, parent exiting检查启动状态并进入
1
2
3
4
5
6[root@localhost bin]# netstat -tunple|grep 27017
tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 0 16183 2662/./bin/mongod
[root@localhost bin]# ./mongo
MongoDB shell version: 2.3.0
connecting to: test
>
mongodb结构体系
数据库-》表-》记录
Mysql:databases->table->row
数据库-》集合-》文档
mongodb:databases->collection->document
数据库基本操作
创建数据库
隐式创建数据库,如果没有写入数据库,数据库则自动消失
1
2> use uiste
switched to db uiste查看数据库
1
2
3> show dbs
local (empty)
test (empty)创建集合
1
2
3
4
5手动创建集合
> db.createCollection('student')
{ "ok" : 1 }
隐式创建集合
> db.child.insert({name:123})查看集合
1
2
3
4
5
6> show collections
child
student
> show tables
child
student删除集合
1
2> db.student.drop()
true删除数据库
1
2> db.dropDatabase()
{ "dropped" : "uiste", "ok" : 1 }查看帮助
help
数据基本操作
增加数据
db.集合.insert(数据)
> db.student.insert({name:'dumin',age:33})
数据采用bson格式
删除数据
db.集合.remove(条件)
justOne可选参数默认为全部删除
db.student.remove({age:23}),{justOne:1})
操作符条件年龄大于24的:db.student.remove({age:{'$gt':24}})`
;$g:大于,$gte:大于等于,$lt:小于,$lte:小于等于1
2
3> db.student.remove({name:'dumin'})
> db.student.find()
{ "_id" : ObjectId("582f9f107943ef82a49db406"), "name" : "xiaolan", "age" : 13 }修改数据
db.集合.update(条件,新值,不存在是否添加:默认false,是否修改多条:默认false)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15> db.student.find()
{ "_id" : ObjectId("582f9f107943ef82a49db406"), "name" : "xiaolan", "age" : 13 }
{ "_id" : ObjectId("582fa21c7943ef82a49db407"), "name" : "xiaolan", "age" : 13 }
{ "_id" : ObjectId("582fa2267943ef82a49db408"), "name" : "dumin", "age" : 23 }
> db.student.update({name:'xiaozhang'},{'score':23})
> db.student.find()
{ "_id" : ObjectId("582f9f107943ef82a49db406"), "name" : "xiaolan", "age" : 13 }
{ "_id" : ObjectId("582fa21c7943ef82a49db407"), "name" : "xiaolan", "age" : 13 }
{ "_id" : ObjectId("582fa2267943ef82a49db408"), "name" : "dumin", "age" : 23 }
> db.student.update({name:'xiaozhang'},{'score':23},1)
> db.student.find()
{ "_id" : ObjectId("582f9f107943ef82a49db406"), "name" : "xiaolan", "age" : 13 }
{ "_id" : ObjectId("582fa21c7943ef82a49db407"), "name" : "xiaolan", "age" : 13 }
{ "_id" : ObjectId("582fa2267943ef82a49db408"), "name" : "dumin", "age" : 23 }
{ "_id" : ObjectId("582fa8636da1e09f672deb59"), "score" : 23 }
修改器
$set:修改某一个字段,如果该字段不存在就增这个字段,语法同操作符
$inc:自增
- 查询数据
1
2
3
4
5
6
7
8> db.student.find()
{ "_id" : ObjectId("582f9ccf7943ef82a49db405"), "name" : "dumin", "age" : 33 }
> db.student.findOne({name:'xiaolan'})
{
"_id" : ObjectId("582f9f107943ef82a49db406"),
"name" : "xiaolan",
"age" : 13
}
主从复制
作用
- 实现读写分离
- 同步数据作为热备服务器
- 可以进行后台的数据统计
思路
- 确定谁是主服务器
- 确定谁是从服务器
- 从服务器从哪里获取数据
实现
主服务器插入数据
1
2
3
4
5> db.student.insert([{name:'dumin',sex:1,age:23},{name:'xiaolan',sex:0,age:28}])
> db.student.find()
{ "_id" : ObjectId("58330e07627dd4a28d28ca57"), "name" : "qiang", "sex" : 1, "age" : 22 }
{ "_id" : ObjectId("58330e60d1dae1108d07fc20"), "name" : "dumin", "sex" : 1, "age" : 23 }
{ "_id" : ObjectId("58330e60d1dae1108d07fc21"), "name" : "xiaolan", "sex" : 0, "age" : 28 }关闭主服务器mongodb服务
1
2[root@localhost ~]# pkill mongo
[root@localhost ~]# netstat -tunple|grep mongo申明主服务器
1
2
3
4
5[root@localhost bin]# ./mongod --logpath=/usr/local/mongodb/log.log --dbpath=/usr/local/mongodb/data/ --fork --master
forked process: 1303
all output going to: /usr/local/mongodb/log.log
log file [/usr/local/mongodb/log.log] exists; copied to temporary file [/usr/local/mongodb/log.log.2016-11-21T14-59-32]
child process started successfully, parent exiting配置从服务器
1
2
3
4
5
6
7
8
9[root@localhost mongodb]# pkill mongo
[root@localhost mongodb]# ./bin/mongod --logpath=/usr/local/mongodb/log.log --dbpath=/usr/local/mongodb/data/ --fork --slave --source=192.168.34.102
forked process: 1744
all output going to: /usr/local/mongodb/log.log
log file [/usr/local/mongodb/log.log] exists; copied to temporary file [/usr/local/mongodb/log.log.2016-11-21T15-14-45]
child process started successfully, parent exiting
```
4. 进入客户端查看
[root@localhost mongodb]# ./bin/mongo
MongoDB shell version: 2.3.0
connecting to: test
show dbs
local 0.0625GB
uiste 0.0625GB
use uiste
switched to db uiste
show collections
student
system.indexes
db.student.find();
{ “_id” : ObjectId(“58330e07627dd4a28d28ca57”), “name” : “qiang”, “sex” : 1, “age” : 22 }
{ “_id” : ObjectId(“58330e60d1dae1108d07fc20”), “name” : “dumin”, “sex” : 1, “age” : 23 }
{ “_id” : ObjectId(“58330e60d1dae1108d07fc21”), “name” : “xiaolan”, “sex” : 0, “age” : 28 }
1
2
3
4
## 权限控制
mongodb中每一个数据库都会具备管理员有一个隐藏的admin数据库,此数据库时超级管理员相关的信息
1. 创建超级管理员
use admin
switched to db admin
db.addUser(‘root’,’123456’)
{
“user” : “root”,
“readOnly” : false,
“pwd” : “34e5772aa66b703a319641d42a47d696”,
“_id” : ObjectId(“583310bc627dd4a28d28ca58”)
}
1
2
2. 创建student用户
可读可写用户
use student
switched to db student
db.addUser(‘uiste’,’123456’)
{
“user” : “uiste”,
“readOnly” : false,
“pwd” : “2f77d219f5631ed7c0c8c833317d1ff5”,
“_id” : ObjectId(“5833113c627dd4a28d28ca59”)
}
只读用户
db.addUser(‘dumin’,’123456’,true)
{
“user” : “dumin”,
“readOnly” : true,
“pwd” : “36ad4172b50f7453498c00c80358d61a”,
“_id” : ObjectId(“58331195627dd4a28d28ca5a”)
}
1
2
3. 启用mongodb密码
[root@localhost bin]# pkill mongo
[root@localhost bin]# ./mongod –logpath=/usr/local/mongodb/log.log –dbpath=/usr/local/mongodb/data/ –fork –auth
forked process: 1408
all output going to: /usr/local/mongodb/log.log
log file [/usr/local/mongodb/log.log] exists; copied to temporary file [/usr/local/mongodb/log.log.2016-11-21T15-26-12]
child process started successfully, parent exiting1
2
3
4
4. 使用密码访问
* 权限校验:需要先选择数据库,然后登陆校验
* 如果直接使用db.auth()校验,不会通过
show dbs
use uiste
db.auth(‘uiste’,’123456’)
show dbs
show tables
db.student.insert({name:’zcc’})
db.student.find()1
2
5. 删除用户
db.system.users.find()
db.system.user.remove({user:’dumin’})1
2
3
## PHP操作mongodb
mongodb 客户端中的“.” 换成“->” bson格式的数据转化成数组
<?php
/**
- MongoClien实例化会自动执行构造方法进行连接
- 一、$mongo = new MongoClient();//直接连接本机上的mongodb服务器
- 二、$mongo = new MongoClient(‘192.168.34.102:27017’);//连接自动的mongodb服务器
- 三、$mongo = new MongoCLient(‘mongodb://root:123456@192.168.34.102:27017’);
*/
// 建立连接
$mongo = new MongoCLient(‘mongodb://root:123456@192.168.34.102:27017’);
// 选择数据库
$db = $mongo->uiste;
$data = $db->student->find();
foreach ($data as $key => $value) {
var_dump($value);
}
?>`