跳至主要內容

MongoDB

Mr.Chen数据库MongoDBmongoose大约 11 分钟约 3342 字

MongoDB

MongoDB

一. MongoDB 介绍:

MongoDB 是一个跨平台,面向文档的数据库,高性能,高可用性和易于扩展。

二、三个概念

  • 数据库:数据库是一个集合的物理容器,一个单一的 MongoDB 服务器通常有多个数据库。
  • 集合:集合是一组 MongoDB 的文件。简单理解就是一个数组
  • 文档 : 文档是一组键值对。(可以认为是 json 格式,但其实是 bson, bson 基于 json 格式) bson 和 json 的区别

三、为什么选择 MongoDB?

  • 学习成本较低
  • 和 Node.js 结合最好, 对 javascript 兼容较好

四、官网链接:

英文官网 - https://www.mongodb.com/中文官网 - https://www.mongodb.com/cn菜鸟教程 - http://www.runoob.com/mongodb/mongodb-tutorial.html

五、安装:

★ win 安装: ( 推荐下载安装 )
★ mac 安装 : ( 推荐在线安装 )
  1. 安装: home brewopen in new window
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    
  2. 测试 brew 安装是否成功:

    brew -v
    
  3. 更新 brew

    brew update
    
  4. 安装 MongoDB

    brew install mongodb --with-openssl
    
  5. 检查:

    mongo --version
    
    //显示如下代表成功:
    MongoDB shell version v3.4.7
    ......
    

六、 启动、连接 mongodb 服务器: ( Win 版 )

win-mongodb 使用open in new window

mac-mongodb 使用open in new window

(一)、启动数据库 服务器:
  • 1.手动创建目录 c:\data\db\
  #  - 如果使用这个路径 `c:\data\db\\`,就可以直接使用第二步,

  #  -  else
  #  - 在启动的时候,可以通过 --dbpath 指定数据服务存储数据的目录  // 目录可以通知点击地址栏获取
  mongod --dbpath D:\mongo-data

  #  -  如果不加--dbpath, mongod 会自动使用 `执行命令所属磁盘根目录`下面的/data/db 目录作为自己的数据存储路径,
  • 2.创建环境变量,右键我的电脑-->属性-->高级系统设置-->环境变量-->新建-->把 mongodb 的 bin 目录复制,然后点击确定

  • 3.在命令行输入 mongod 启动服务 (注意 : 不是 mongodb 也不是 mongo)

  #  > mongod   mac 下 要使用 sudo mongod
  #  // 如果出现下面这句话才算 OK
  #  > ....  waiting for connections on port 27017
  • 4.**[ 切记 ] **停止服务:按 ctr + c,不要直接通过关闭 cmd 窗口的方式来关闭
    • 任务管理器 关闭进程
    • 找到 mongod.lock 删掉
(二)、连接数据库 服务器:
  1. 再打开一个 cmd 窗口
  2. 通过 mongo 命令连接数据库服务器
  3. mongo 命令默认去连接本机上的 MongoDB 服务实例:127.0.0.1:27017
  4. 也可以通过下面的命令,指定连接的主机名和端口号:
mongo --host 127.0.0.1 --port 27017
(三)、操作数据库 服务器:

七、 开启、连接 mongodb 服务器: ( Mac 版)

win-mongodb 使用
win-mongodb 使用
mac-mongodb 使用
mac-mongodb 使用
(一)、启动数据库 服务器:
    1. 创建 /data/db 目录 ;
  # 代码执行
  sudo mkdir -p /data/db   //sudo 提高权限    目录在 Finder/左侧设备/XXX/Machintosh/data/db
    1. 开启数据库服务器:
  #  开启
  sudo mongod

  else ....
  # ------------ 指定路径分割线 -----------
  # // 指定路径开启
  # 1. 创建一个目录: mongodb-data
  sudo mongod --dbpath # [把文件夹直接拖进来]

  # //开启成功:--- 正确分割线-----------
  #  : waiting for connections on port 27017
  # --------------错误分割线-----------
  # //千万要注意: 一定要正常退出,,不要直接 X 掉终端,,没用的,,下次开开启开不了,用也用不了
  # // 如果报错已经在 use : addr already use, 说明就是
  # // 查看当前进程
  ps -aef | grep mongo
  //显示
  501 10576 6955 0 5:44下午 ttys002   0:00.0 grep mongo
  //杀掉进程: (不要杀 PID 是1的--那是关机)
  sudo kill 6955
  // 杀到后,找到 MacintoshHD 的 data/db 里面全部删掉,再次重启:
  sudo mongod 即可
    1. **[ 切记 ]**停止服务:
    • 按 cmd + c,不要直接通过关闭终端 窗口的方式来关闭

    (二)、连接数据库 服务器:
  • 再打开一个终端窗口

  • 执行mongo命令,连接数据库服务器

  • mongo 命令,默认去连接本机上的 MongoDB 服务实例: 127.0.0.1:27017

  • 也可以通过下面的命令,指定连接的主机名和端口号:

    mongo --host 127.0.0.1 --port 27017
    

    提示:如果提示 “无法连接主机”,请检查你的 MongoDB 数据服务实例是否开启。

​ (三)、操作数据库 服务器:

总结:
  1. 开启数据库服务器: mongod / sudo mongod
  2. 连接....................: mongo
  3. 关闭....................: Ctr+C

八、基本操作命令

1. 查看服务器里所有的数据库 : show dbs

  • > show dbs
    admin       0.000GB
    hackernews  0.000GB
    local       0.000GB
    test1104    0.000GB
    

2. 切换 / 创建数据库 : use 数据库名称

  • 如果在创建的数据库里,不创建集合, 辣么,退出后,数据库也就消失了;
  • (简单了解即可) 连接到数据库之后,默认有一个变量叫做:db,终端默认把 db 赋值给了 test

  • > use test1104
    switched to db test1104
    

3. 查看当前所处的数据库 : db

  • > db
    test1104    //(如果没有指定具体的数据库就会返回一个测试的: test)
    

4.操作命令(增删改查)

4.1 查询

查看当前数据库中所有的集合 : show collections

show collections
   //aaa
   //news

查询该集合中的所有数据 : db.集合名称.find()

  • 可以通过 db.集合名称.find().pretty() 美化输出格式 (如果属性少就不会显示美化格式)
  • 默认是查询所有,可以通过:db.集合名称.find({查询条件}) 按条件查询集合中的数据

根据条件查询该集合某一条/多条数据: db. 集合. find(条件) [具体查询]

查看具体数据

  // gt: greate than
  // lt: less than
  // e: equal
  // ne: not equal
  > db.aaa.find({age:{$gte:18}})   // 查看 age >= 18 的
  { "_id" : ObjectId("59fcb97f6208a88400da6d65"), "name" : "xingge", "age" : 18 }
  { "_id" : ObjectId("59fcbee26208a88400da6d69"), "nage" : "huge", "age" : 19 }

4.2 新增

创建集合并插入一条 数据 :

  • db. 集合名称. insertOne ( 数据文档 )

创建集合并插入多条 数据 :

  • db. 集合名称. insertMany ( 数据文档 )

  • 如果没有集合就创建,

  • 如果有集合,就直接插入数据

  // 1. 插入一条
  > db.news.insertOne({id:1, title:"news title", url:"http://www.baidu.com", text:"百度一下,你就知道"});
  > WriteResult({ "nInserted" : 1 })   // insert 成功

  // 2. 插入多条  [{},{},{}]  数组里有对象
  db.news01.insertMany([
    { title: "张三",  url: 'www.zhangsan.com', text:'我是张三,谁与我争雄'},
    { title: "李四",  url: 'www.lisi.com', text:'我是李四,我不爱女人,只爱妖妖'},
    { title: "王五",  url: 'www.wangwu.com', text:'我住隔壁,我姓王'}
  ])
  > {                  // 插入多条成功
  	"acknowledged" : true,
  	"insertedIds" : [
  		ObjectId("59fcc3f96208a88400da6d6e"),
  		ObjectId("59fcc3f96208a88400da6d6f"),
  		ObjectId("59fcc3f96208a88400da6d70")
  	]
  }

4.3 更新

更新指定集合数据 :

  • db.集合名称.update({更新条件},{$set:{要更新的字段}})

  • 更新指定集合数据

  • 满足一个条件的多个数据修改,还要在后面添加 ,{multi:true}

db.aaa.update({ age: 18 }, { $set: { name: 'xiaomage' } }, { multi: true });

WriteResult({ nMatched: 2, nUpserted: 0, nModified: 2 }); //更新成功

4.4 删除

删除集合的某个文档 :

  • db.集合名称.remove({删除条件})
  • 删除指定集合中的数据

删除集合:

  • db.集合名称.drop()

  • 参考文档:https://docs.mongodb.com/manual/crud/

  • 参考文档:http://www.runoob.com/mongodb/mongodb-update.html (推荐)

九、Node.js 操作 MongoDB — 使用 MongoDB 驱动器

这个 mongodb 是 MongoDB 驱动器 (driver) ,帮助 nodejs 来操作 mongo 数据库的,虽然名字一样,但是实质不一样

  1. Quick Start 参考文档:

    MongoDB - Quick Start —>找: Connect to MongoDB npmj- Quick Start —> 找: Connecting to MongoDB 菜鸟教程

  2. 安装:

    npm init -y   //初始化包配置文件
    npm i mongodb -SD   //安装
    
  3. 前提:开启数据库服务器 : 终端开启MongoDB 服务器 : 执行:mongod / mongod -dbpath 新路径

    • 如果是 mac 记得加 sudo: sudo mongod
    • 检查是否操作成功: 可以打开 mongo 查看
  4. CRUD [增删改查]

十、 CRUD (增删改查)

  1. 连接数据库服务器:

    //1. 加载 mongodb
    var mongodb = require('mongodb');
    
    //2. 获取一个连接数据库的对象 MongoClient
    var MongoClient = mongodb.MongoClient;
    
    //3. 连接字符换   连接到数据库进程 数据db01里
    // var url = 'http://127.0.0.1....'
    var url = 'mongodb://127.0.0.1:27017';
    
    //4. 开始连接
    /// [注意]一定要注意,终端开启数据库服务器 sudo mongod
    MongoClient.connect(url, function (err, client) {
      if (err) {
        throw err;
      }
      console.log('连接上了数据库');
    
      //5. 一定要关闭
      client.close();
    });
    

  2. 插入单条数据

    • 使用方法:

      ** client.db('数据库名称'). collection(集合名称) . insertOne ( { 数据 } , callback(err) ) **

  • insert( {数据 }, callback ) — 已经废弃
//1. 插入单条数据
// [注意1] 插入数据是异步的  所以要有个回调函数
// [注意2] insert() 在 3.2版本之后,已经慢慢被废弃,插入单条的话
//    使用 insetOne()
db.collection('heros').insertOne({ name: '星哥', age: 18 }, function (err, doc) {
  if (err) {
    throw err;
  }
  console.log(doc);
  //{ result: { ok: 1, n: 1 },
  // ops: [ { name: '星哥', age: 18, _id: 59fd23fd2ae663070b66a4f7 } ],
  // insertedCount: 1,
  // insertedIds: [ 59fd23fd2ae663070b66a4f7 ] }

  //[注意] 取值之后,一定要记得关闭数据库
  db.close();
});

  1. 插入多条数据

    • 使用方法 : (client 是形参 不固定)

      client.db('数据库名称'). collection(集合名称) .insertMany ( [ { 数据 1 } , { 数据 2 }] , callback(err,result) )

    //2. 插入多条数据
    // [注意] 插入数据是异步的
    // 所以要有个回调函数
    client
      .db('数据库名称')
      .collection(集合名称)
      .insertMany(
        [
          { name: '虎哥', age: 80 },
          { name: '达达', age: 18 },
          { name: '香香', age: 19 },
        ],
        function (err, doc) {
          if (err) {
            throw err;
          }
          console.log(doc);
          // { result: { ok: 1, n: 3 },
          // ops:
          //  [ { name: '虎哥', age: 80, _id: 59fd24e2b28af807465884cc },
          //    { name: '达达', age: 18, _id: 59fd24e2b28af807465884cd },
          //    { name: '香香', age: 19, _id: 59fd24e2b28af807465884ce } ],
          // insertedCount: 3,
          // insertedIds:
          //  [ 59fd24e2b28af807465884cc,
          //    59fd24e2b28af807465884cd,
          //    59fd24e2b28af807465884ce ] }
          //[注意] 取值之后,一定要记得关闭数据库
          client.close();
        },
      );
    

  2. 查询全部数据

    • 使用方法 :

    //多个数据满足条件

    client.db('数据库名称'). collection(集合名称).find ( { 条件 } ) . toArray ( callback(err,docs) ) : 条件可有可无

    • 打印的 doc: 是一个数组, (查询首页列表适合用)
    //5. 全部获取数据
      db.collection('heros').find().toArray(function (err,doc) {
    
        if (err) {
      throw err
        }
    
        // [查询多条的区别]
        // 1. client.db('数据库名称'). collection(集合名称).find().toArray(callback)
        // 2. doc 是一个数据集合
        console.log(doc)
    
        client.close()
      })
    })
    

  3. 查询单条数据

    • 使用方法 : client.db('数据库名称'). collection(集合名称).findOne( {条件} , callback(err,doc) )
    • doc 打印的是一个 对象 : (查询某个详情页适合用)
    //5.查询单条数据
    client
      .db('数据库名称')
      .collection(集合名称)
      .findOne({ age: 16 }, function (err, doc) {
        if (err) {
          throw err;
        }
        console.log(doc);
        // 打印的是一个对象
        //{ _id: 59fd259fc83c80e709dff4dc, name: '老宫', age: 16 }
    
        // 异步里关闭数据库
        db.close();
      });
    

  4. 更新数据

    • 使用方法: client.db('数据库名称'). collection(集合名称).updateOne ( {条件} , { $set: {更新字段 }} , callback )

    • 更新多条: updateMany

    • 如果只跟新一条是用$ set, 如果工作中的编辑页面是要获取所有的信息都要更新一遍的

      所以,直接写对象即可,不用$ set 了

    //5. 更新数据
    // client.db('数据库名称'). collection(集合名称).update(参数1,参数2,回调)
    
    client
      .db('数据库名称')
      .collection('heros')
      .updateOne({ age: 16 }, { $set: { name: '丹丹' } }, function (err, doc) {
        if (err) {
          throw err;
        }
    
        console.log(doc);
    
        console.log('ok');
    
        client.close();
      });
    

  5. 删除数据

    • 删除单条:

    client.db('数据库名称'). collection('heros').deleteOne ( {条件} , callback )

    • 删除多条: deleteMany ( {条件} , callback )
    //6.删除
    //删除多条 client.db('数据库名称'). collection('heros').deleteMany()
    client
      .db('数据库名称')
      .collection('heros')
      .deleteOne({ age: 16 }, function (err, doc) {
        if (err) {
          throw err;
        }
    
        console.log('删除成功');
    
        //6. 关闭数据库
        client.close();
      });
    

十一、权限管理

  1. 创建用户
  • 语法格式:
db.createUser(
{ user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...

]}
)
//实例

> use admin
> db.createUser(
> {user:'useradmin',
> pwd:'123456',
> customData:{"desc":"This user is for administrators"}> roles:[{role:'userAdminAnyDatabase',db:'admin'}]
> })

  • user:用户名
  • pwd:密码
  • customData: 用于描述账户信息
  • roles:指定用户的角色,可以用一个空数组给新用户设定空角色;在 roles 字段,可以指定内置角色和用户定义的角色。

role 里的角色可以选


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

具体角色:

  • Read:允许用户读取指定数据库
  • readWrite:允许用户读写指定数据库
  • backup,retore:在进行备份、恢复时可以单独指定的角色,在 db.createUser()方法中 roles 里面的 db 必须写成是 admin 库,要不然会 报错
  • dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问 system.profile
  • userAdmin:允许用户向 system.users 集合写入,可以找指定数据库里创建、删除和管理用户
  • clusterAdmin:只在 admin 数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
  • readAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读权限
  • readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限
  • userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限,
  • dbAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 dbAdmin 权限。
  • root:只在 admin 数据库中可用。超级账号,超级权限

上次编辑于: