Web开发

MongoDB安装、配置以及操作介绍

2018-07-02  本文已影响0人  nimw

1. 简介

  1. 数据库分类
    (1)关系型数据库,是指采用了关系模型来组织数据的数据库。关系型数据库遵循ACID规则。
    (2)非关系型的数据库(NoSQL-Not Only SQL)是对不同于传统的关系型数据库的数据库管理系统的统称。
    参考: 关系型数据库和非关系型数据库区别、oracle与mysql的区别
  2. MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。
  3. MongoDB 文档类似于 JSON对象。字段值可以包含其他文档,数组及文档数组。
  4. 数据库对比
SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键

2. 安装

  1. 路径
    (1) 安装目录
    /usr/local/Cellar/mongodb/3.4.3
    (2) 配置文件目录
    /usr/local/etc/mongod.conf
    注释: 配置文件中有数据库目录和日志输出文件目录。
    (3) 日志输出文件目录
    /usr/local/var/log/mongodb/mongo.log
    (4) 数据库目录
    /usr/local/var/mongodb
    注释: admin数据库是存放管理员信息的数据库。
  2. mongod.conf配置文件
systemLog:
  destination: file
  # 日志文件路径
  path: /usr/local/var/log/mongodb/mongo.log
  # 日志是累加而不是覆盖
  logAppend: true
storage:
  # 数据库存储路径
  dbPath: /usr/local/var/mongodb
net:
  # 绑定ip, 如果要绑定多个ip,可以用数组表示
  bindIp: 127.0.0.1

注意:如果mongod.conf文件中绑定了ip,则只有绑定的ip对应的客户端才能够访问。

  1. 启动
    (1) 开启MongoDB服务
    mongod -f /usr/local/etc/mongod.conf
    地址:http://localhost:27017/
    注释: 可以修改MongoDB默认27017端口
    (2) 客户端连接服务端
    mongo
  2. 关闭MongoDB服务
    use admin;
    db.shutdownServer();
    注释: 只有在admin数据库中时才能关闭MongoDB服务。
  3. 安装路径下的exe程序介绍
    (1) mongo.exe 客户端, 支持js语法!
    (2) mongod.exe 服务端
    (3) mongodump.exe 备份工具
    (4) mongorestore.exe 恢复工具
    (5) mongoexport.exe 导出工具
    (6) mongoimport.exe 导入工具
    (7) mongostat.exe 实时性能监控工具
    (8) mongotop.exe 跟踪MongDB实例读写时间工具
    注释: mongo.exe客户端工具和mongod.exe服务端工具最常用。

3. 操作

3.1 mongo.exe客户端

3.1.1 操作用户

3.1.1.1 创建用户

  1. 创建root用户
 # 非认证启动
 mongod -f /usr/local/etc/mongod.conf 
# 新开窗口进入shell终端
➜  ~ mongo
# 查看已有数据库
> show dbs 
# 查看/切换到admin数据库
> use admin
switched to db admin
# 创建root用户,指定用户名、密码、角色和数据库
> db.createUser({user: 'root', pwd: 'root', roles:[{role: 'userAdminAnyDatabase', db: 'admin'}]})
Successfully added user: {
    "user" : "root",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}

注释: ① 建立了 userAdminAnyDatabase 角色,用来管理用户,可以通过这个角色来创建、删除用户。② userAdminAnyDatabase权限只是针对用户管理的,对其他(数据库读写等)是没有权限的。
注意: ① 用户与数据库是绑定的,在某一个数据库里创建的用户只能够在该数据库中进行认证。② 一般只创建操作当前数据库的用户(db填当前数据库),如果创建了操作其他数据库的用户,则需要在用户创建库中进行认证,然后再去其他数据库中操作 ③ 以非认证的方式启动数据库则不需要用户权限。

  1. 通过root用户创建其他用户
 # 认证启动
mongod -config /usr/local/etc/mongod.conf --auth
# 新开窗口进入shell终端
➜  ~ mongo
> show dbs 
# Error 报错。没有验证,所以没有权限。
> use admin  #验证,因为在admin下面添加的帐号,所以要到admin下面验证。
switched to db admin
> db.auth('root', 'root')
1
> show dbs
# 展示所有数据库
> use test  #在test库里创建帐号
switched to db test
> db.createUser({user: 'test', pwd: 'test', roles: [{role: 'readWrite', db: 'test'}]})
> show users #查看当前库下的用户

注释: ① --auth代表授权启动,需要帐号密码才能访问。auth=true可以加到mongo.conf配置文件里面去进行统一管理。② 以非认证的方式启动mongoDB也可以创建用户,创建过程与创建root用户相同。

  1. 用户角色分类
  1. 具体角色权限
3.1.1.2 授权认证
 # 认证启动
mongod -config /usr/local/etc/mongod.conf --auth
# 新开窗口进入shell终端
➜  ~ mongo

# root用户授权验证
> use admin 
switched to db admin
> show dbs # 报错,没有权限
> db.auth('root', 'root') # 授权用户
> show dbs # 成功,展示所有数据库

# test用户授权验证
> use test
> show tables # 报错,没有权限
> db.auth('test', 'test') # 授权用户
> show tables  # 成功,展示当前数据库中所有表
3.1.1.3 查看/删除用户
> mongo 
# 操作所有用户只在admin数据库中可用
> use admin 
switched to db admin
> db.auth('root','root') # 授权认证
> show users #查看当前数据库中的用户
> db.system.users.find().pretty()  #查看所有数据库中的用户
{
    "_id" : "admin.root",
    "user" : "root",
    "db" : "admin",
    "credentials" : {
        "SCRAM-SHA-1" : {
            "iterationCount" : 10000,
            "salt" : "myPBMNr+71D/BHR2KNIs7g==",
            "storedKey" : "ar4RsCe/Mn0rm3DpCscUtLJy32Q=",
            "serverKey" : "fbZ69Fo+IPMxFCznNIW2rZJqoDU="
        }
    },
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
> db.system.users.find().count()
1
> db.system.users.remove({user:"root"})
WriteResult({ "nRemoved" : 1 })
> db.system.users.find().count()
0

3.1.2 操作数据库

3.1.2.1 查询
  1. 查看所有数据库
    show dbs
  2. 新建/切换到数据库
    use test
    注释: 只有在插入表数据之后才真正实现数据库的创建。
  3. 查看当前数据库
    db
    注释: db表示当前数据库。
  4. 查看集合
    show collections/tables
  5. 查看当前集合所有数据
    db.集合名.find()
  6. 格式化查看当前集合所有数据
    db.集合名.find().pretty()
  7. 查看集合中第一条数据
    db.集合名.findOne()
  8. 限制数量
    db.集合名.find().limit(数量)
  9. 跳过指定数量
    db.集合名.find().skip(数量)
  10. 查询数量
    db.表名.find().count()
  11. 排序
    db.表名.find().sort({"字段名":1}) //1表示升序; -1表示降序
  12. 指定字段返回
    db.表名.find({},{"字段名":0}) //1返回; 0不返回
  13. 比较查询
    大于- $gt;小于- $lt;大于等于- $gte;小于等于- $lte;非等于- $ne;或者- $or;包含- $in;不包含- $nin
  14. 正则表达式
    /匹配字符/new RegExp("匹配字符")
 > for(let i = 0; i < 10; i++) {
     db.tb.save({'name': 'jake'+ i, id: i, msg: {age:i}})
     //mongo.exe 客户端, 支持js语法!
  }
> db.tb.find()   
0-10
> db.tb.find({'id': 3})
3
> db.tb.find({'msg.age': 6})
6
> db.tb.find().limit(3)
0-2
> db.tb.find().limit().skip(2).limit(2)
2、3
> db.tb.find({'msg.age': {'$gt':7}})
8、9
> db.tb.find({'id': {'$lt':3, '$gte':1}})
1、2 
> db.tb.find({'id': {'$ne':3}})
0-2、4-9
> db.tb.find({'$or': [{'id':3}, {'name': 'jake7'}]})
3、7
> db.tb.find({'id': {'$in': [2,4]}});
2、4
> db.tb.find({'id': {'$nin': [1,3,5,7,9]}});
0、2、4、6、8
> db.tb.find({'id': {'$gt':2}}).count()
7
> db.tb.find({'msg.age': {'$lte':6}}).sort({id: -1}).limit(2);
6、5
> db.tb.find({id: {'$gte': 6}}, {msg: 0})
{ "_id" : ObjectId("5b559f72e1aefaf030c8d016"), "name" : "jake6", "id" : 6 }
{ "_id" : ObjectId("5b559f72e1aefaf030c8d017"), "name" : "jake7", "id" : 7 }
{ "_id" : ObjectId("5b559f72e1aefaf030c8d018"), "name" : "jake8", "id" : 8 }
{ "_id" : ObjectId("5b559f72e1aefaf030c8d019"), "name" : "jake9", "id" : 9 }
> db.tb.find({name: /^jake(1|2)$/})
{ "_id" : ObjectId("5b559f72e1aefaf030c8d011"), "name" : "jake1", "id" : 1, "msg" : { "age" : 1 } }
{ "_id" : ObjectId("5b559f72e1aefaf030c8d012"), "name" : "jake2", "id" : 2, "msg" : { "age" : 2 } }
3.1.2.2 增加
  1. 新增数据库表
    db.createCollection('user')
    注释:一个集合相当于一个表。
  2. 创建集合并插入数据
    (1) 使用insert方法插入一条数据
    db.user.insert({id:1, name:'hello'})
    (2) 使用save方法插入一条数据
    db.user.save({id:2, name:'mongo'})
    (3) 插入数据时指定_id
    db.user.insert({_id: 0, id:1, name:'hello'})
    db.save.insert({_id: 0, id:1, name:'hello'})
    注意: ① 如果已有user表则在该表中插入一条数据,如果没有user表则创建user表并插入一条数据。② 如果未指定_id,则mongodb会给该条数据默认生成_id。③ 如果指定的_id与已有某条数据的_id相同,则sava方法更新数据,insert方法抛出异常。
2.1.2.3 删除
  1. 删除当前数据库
    db.dropDatabase()
  2. 删除数据库表
    db.表名称.drop()
  3. 删除表中某一条数据
    db.表名.remove(条件);
> db.tb.remove({id: {$gt: 5}})
3.1.2.4 修改
  1. 更新集合中某一条数据
    db.表名.update({"条件字段名":"字段值"},{$set:{"要修改的字段名":"修改后的字段值"}});
> db.tb.update({name: 'jake0'}, {$set: {'msg.age': 6}});
> db.tb.update({'msg.age': 5}, {$set: {'id': 10}})

注释:update方法的第一个参数起到查询的效果,更新查询到的某一条数据。

3.2 Node操作数据库

3.2.1 增删改查

3.2.1.1 增加
  1. 创建集合
const MongoClient = require('mongodb').MongoClient;

const url = 'mongodb://127.0.0.1:27017';

MongoClient.connect(url, (err, client) => {
    console.log('连接成功!');
    const db = client.db('test');
    db.createCollection('tb1', function (err, res) {
        if (err) throw err;
        console.log("创建tb1集合!");
        client.close();
    });
});
  1. 创建集合并插入数据
const MongoClient = require('mongodb').MongoClient;

const DB_CONN_STR = 'mongodb://127.0.0.1:27017';

MongoClient.connect(DB_CONN_STR, (err, client) => {
    console.log('连接成功!');
    const db = client.db('test');
    const collection = db.collection('tb2');
    const data = [
        {name: 'wilson01', age: 18},
        {name: 'wilson02', age: 20}
    ];
    collection.insert(data, (err, result) => {
        if(err) {
            console.log('Err' + err);
            return;
        } else {
            console.log(result);
            client.close();
            //{ result: { ok: 1, n: 2 },
            //   ops:
            //    [ { name: 'wilson01', age: 18, _id: 5b55de761ffbb2ac7f041dcf },
            //      { name: 'wilson02', age: 20, _id: 5b55de761ffbb2ac7f041dd0 } ],
            //   insertedCount: 2,
            //   insertedIds: { '0': 5b55de761ffbb2ac7f041dcf, '1': 5b55de761ffbb2ac7f041dd0 }
            // }
        }
    })
});

注释: insert()方法既能够插入一条又能够插入多条数据; insertOne()方法只能够插入一条数据;insertMany()方法可以插入多条数据。

3.2.1.2 查询
  1. 简单查询
const MongoClient = require('mongodb').MongoClient;

const DB_CONN_STR = 'mongodb://127.0.0.1:27017';

const selectedData = (client, callback) => {
    const db = client.db('test');
    const collection = db.collection('tb2');
    const whereStr = {age: 20};
    collection.find(whereStr).toArray((err, result) => {
        if(err) {
            console.log('Err' + err);
            return;
        } else {
            callback(result);
            //[{ _id: 5b55de761ffbb2ac7f041dd0, name: 'wilson01', age: 20 }]
        }
    })
};

MongoClient.connect(DB_CONN_STR, (err, client) => {
    console.log('连接成功!');
    selectedData(client, (result) => {
        console.log(result);
        client.close();
    });
});
  1. 条件查询
const MongoClient = require('mongodb').MongoClient;

const DB_CONN_STR = 'mongodb://127.0.0.1:27017';

const selectedData = (client, callback) => {
    const db = client.db('test');
    const collection = db.collection('tb');
    //查询所有
    collection.find().toArray((err, result) => {
        if(err) throw  err;
        callback(result);
        //1,2,3,4,5
    })
    //正则查询
    collection.find({name: /^jake(1|2)$/}).toArray((err, result) => {
        if(err) throw  err;
        callback(result);
        //1,2
    })
    //查询排序
    collection.find({id: {$gt: 2}}).sort({id: -1}).toArray((err, result) => {
        if(err) throw  err;
        callback(result);
        //5, 4, 3
    })
    //查询分页
   collection.find({id: {$ne: 3}}).limit(3).toArray((err, result) => {
        if(err) throw  err;
        callback(result);
        //1, 2, 4
    })
    //查询跳页
    collection.find().skip(2).toArray((err, result) => {
        if(err) throw  err;
        callback(result);
        //3, 4,5
    })
};

MongoClient.connect(DB_CONN_STR, (err, client) => {
    selectedData(client, (result) => {
        console.log(result);
        client.close();
    });
});

注释: 支持mongo命令终端支持的查询语句。

3.2.1.3 修改
const MongoClient = require('mongodb').MongoClient;

const DB_CONN_STR = 'mongodb://127.0.0.1:27017';

const updateData = (client, callback) => {
    const db = client.db('test');
    const collection = db.collection('tb2');
    const whereStr = {name: 'wilson01'};
    const updateStr = {$set: {age: 28}};
    collection.updateMany(whereStr, updateStr, (err, result) => {
        if(err) {
            console.log('Err' + err);
            return;
        } else {
            callback(result);
        }
    })
};

MongoClient.connect(DB_CONN_STR, (err, client) => {
    console.log('连接成功!');
    updateData(client, (res) => {
        console.log(res.result.nModified + " 条文档被更新");
        //1 条文档被更新
        client.close();
    });
});

注释: ① updateOne()方法只会更新第一个符合条件的数据。 updateMany()方法会更新所有符合条件的数据。② res.result.nModified 为被更新的条数。

3.2.1.4 删除
  1. 删除集合
const MongoClient = require('mongodb').MongoClient;

const DB_CONN_STR = 'mongodb://127.0.0.1:27017';

const delData = (client, callback) => {
    const db = client.db('test');
    const collection = db.collection('tb2');
    collection.drop((err, result) => {
        if(err) throw  err;
        callback(result)
    })
};

MongoClient.connect(DB_CONN_STR, (err, client) => {
    console.log('连接成功!');

    delData(client, (res) => {
        console.log(res);
        client.close();
    });
});
  1. 删除查询到的数据
const MongoClient = require('mongodb').MongoClient;

const DB_CONN_STR = 'mongodb://127.0.0.1:27017';

const delData = (client, callback) => {
    const db = client.db('test');
    const collection = db.collection('tb2');
    const whereStr = {name: 'wilson01'};
    collection.deleteOne(whereStr, (err, result) => {
        if(err) {
            console.log('Err' + err);
            return;
        } else {
            callback(result);
        }
    })
};

MongoClient.connect(DB_CONN_STR, (err, client) => {
    console.log('连接成功!');

    delData(client, (res) => {
        console.log(res.result.n + " 条文档被删除");
        //1 条文档被删除
        client.close();
    });
});

注释: ① deleteOne()方法会删除第一条符合条件的数据。deleteMany() 方法会删除所有符合条件的数据。② res.result.n 删除的条数。

3.3 其他exe程序操作

  1. mongoimport导入
    mongoimport --host 127.0.0.1:19999 -d(指定数据库) demo -c(指定表名称) --file user ./dbbackup/dumall-backup/user.json
  2. mongoexport导出
    mongoexport -d(指定数据库) demo -c(指定表名称) user -q(过滤条件,可以省略) ‘{“name”: {$ne: null}}’ -o(导出文件名)

4. 参考

MongoDB中文文档
Mac环境下安装和配置MongoDB
mac系统下安装、启动、停止mongodb
MongoDB 3.0 用户创建

上一篇下一篇

猜你喜欢

热点阅读