Mongodb

NOSQL:非关系型数据库

特性

  1. 读写速度特别快

    原因内存映射机制:先将数据写入内存,写入完成后通过异步方式将内存中的数据写入文档中
    查询部分使用频率较高的数据还停留在内存中。所需空间特别大

  2. 数据无规则

    每一条数据都可以随意添加减少属性

  3. 支持主从复制

    支持主从复制实现数据同步,故可以实现读写分离。自带监察模式,主服务器出现问题,自动在从如曲奇中选择一个服务器作为主服务器

  4. 支持数据分片

    支持分布式存储

  5. 不受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. 可以进行后台的数据统计

思路

  1. 确定谁是主服务器
  2. 确定谁是从服务器
  3. 从服务器从哪里获取数据

实现

  1. 主服务器插入数据

    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 }
  2. 关闭主服务器mongodb服务

    1
    2
    [root@localhost ~]# pkill mongo
    [root@localhost ~]# netstat -tunple|grep mongo
  3. 申明主服务器

    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
  4. 配置从服务器

    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 exiting

1
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);
    }
    ?>
    `