美文网首页基础前端开发
MongoDB 芒果数据库的使用

MongoDB 芒果数据库的使用

作者: CondorHero | 来源:发表于2019-08-07 13:29 被阅读3次
    一、两种主流的数据库
    • 关系型数据库
    • 非关系型数据库

    SQL 就是 Structor Query Language 结构化查询语言。典型的关系型数据库最大的优点就是主从查找。。

    缺点,就是限制字段,表的字段是不能自由更改的,不能某一个条目有一些字段,另外的条目的没有。


    于此相比 MongoDB 就灵活的多了。

    二、MongoDB 安装和指导

    非常简单,简单的令人发指。

    1.芒果数据库,官网:https://www.mongodb.com/
    下载可以选择 zip 格式或者 msi 格式,msi 格式就是下一步、下一步安装。我们讲解 zip格式。

    • 解压缩这个文件夹,千万不要有中文路径
    • 解压之后找到你的 bin 文件夹,再次确认没有中文路径。
    • 将这个bin 文件夹路径设置为系统的环境变量。
    • 在系统任何盘符下能够输入mongo命令不会报“mongo不是可以执行的命令”错误。说明你已经成功安装。
    1. 备用下载链接:http://dl.mongodb.org/dl/win32/x86_64
    1. 学习教程查找:


      1
      2
      3
      4
    三、数据库的基本操作

    要找一个地方建立文件夹存储数据库。我建的文件夹名为 database。
    首先需要使用 mongod 来“开机”,表示打开数据库。用 mongod 来开机。

    开机命令:
    mongod --dbpath D:/mongodb/database
    --dbpath表示数据库的路径。

    此时光标是挂起状态的。
    等待连接,提示如下:

    2019-08-06T21:57:16.391+0800 I NETWORK  [initandlisten] waiting for connections
    on port 27017
    

    补充如果连接了显示0 connections now open 如果没连接数据库了显示1 connections now open

    2019-08-06T22:00:32.272+0800 I NETWORK  [conn1] end connection 127.0.0.1:49588 (
    0 connections now open)
    2019-08-06T22:00:41.539+0800 I NETWORK  [listener] connection accepted from 127.
    0.0.1:49589 #2 (1 connection now open)
    

    此时注意,这个CMD窗口不能关闭,一关闭CMD窗口,数据库就关闭了。


    再打开一个新的CMD窗口:输入 mongo 就能进入 mongo 的 REPL 环境(Read-Eval-Print-Loop,读一句、执行一句、显示一句)
    我输入 100 + 99 回车计算输出结果如下


    操作数据库就是在 REPL 里面操作的。

    在REPL环境中:

    > use student
    

    这行语句表示使用 student 数据库,此时没有 student 数据库,MongoDB会帮我们自动创建。


    此时我们试着插入一条数据:

    > db.class1.insert({"people":57,"gir":38,"boy":19})
    
    提示成功写入一条数据

    class1 这个集合完全可以当做,student 这个数据库的表。

    >db.class1.find()
    

    此时我们想查看这条数据:


    四、看看 NodeJS 和 MongoDB 怎样连接
    • 基本连接
      新建一个 nodedb 文件夹,安装依赖,需要注意的是如果安装最新版的会发出警告:
    (node:4488) DeprecationWarning: current URL string parser is deprecated, and wil
    l be removed in a future version. To use the new parser, pass option { useNewUrl
    Parser: true } to MongoClient.connect.
    

    版本问题,测试结果如下:


    本人实测node安装Mongodb不警告,最高版本3.0.9.png

    安装依赖并指定版本:

    npm install --save mongodb@3.0.9
    

    https://www.npmjs.com/package/mongodb

    补充个知识点 node 内置 assert (断言)的用法

    在 01.js 文件输入以下内容,node 01.js 运行
    const assert = require("assert");
    let a = 1438;
    console.log("如果assert.equal()里面的两个参数相等,就会输出五角星")
    assert.equal(a,1438);
    console.log("☆☆☆☆☆☆☆☆");
    

    assert.equal()里面的两个参数相等,后面的语句成功执行。



    现在改变以下:

    const assert = require("assert");
    let a = 1438;
    console.log("如果assert.equal()里面的两个参数相等,就会输出五角星")
    assert.equal(a,"你是三八");
    console.log("☆☆☆☆☆☆☆☆");
    

    assert.equal()里面的两个参数不相等,成功报错,后面的语句不执行。其中相等比较包含隐式转换。


    现在开始正儿八经去官方文档查看 node 怎么连接 MongoDB,献出 API:
    API:Quick Start https://mongodb.github.io/node-mongodb-native/3.3/quick-start/quick-start/

    // 引入mongodb
    const MongoClient = require('mongodb').MongoClient;
    // 断言为下面的连接状态返回结果是true还是false准备
    const assert = require('assert');
    
    // Connection URL数据库连接网址
    const url = 'mongodb://localhost:27017';
    
    // Database Name数据库名,没有会自动创建
    const dbName = 'class';
    
    // Create a new MongoClient实例化这个方法
    const client = new MongoClient(url);
    
    // Use connect method to connect to the Server
    // 连接数据库
    client.connect(function(err) {
      //如果连接错误则会抛出错误,不在执行此语句的下面的语句
      assert.equal(null, err);
      // 上面的语句没有错误,则显示正确连接
      console.log("Connected successfully to server");
      // 连接database这个数据库
      const db = client.db(dbName);
    
      // ============数据库操作区域===================
      
      // 关闭数据库连接
      client.close();
      // ============数据库操作区域===================
    });
    

    引入文档内容添加注释,然后 node 返回结果成功!完美。


    数据库成功连接

    不过的提一句,断言 assert 打断程序,因为直接刨一个错误,也不给提示,不很友好所以使用 if 替代是比较好的方案。

    五、集合和文档的概念

    数据库由集合组成,集合就是 JSON 的集合,每一条 JSON 叫做一个文档。
    集合:

    collection

    文档:

    JSON

    MongoDB 用 JSON 来存储数据。可以想当然的认为一个 JSON 就是一个 document ,一个 document (文档)就是一个表。

    六、node 操作 MongoDB进行增删查改
    6.1 、增
    • 增加多条insertMany([],callback)
      增加我所有女朋友的列表。嘻嘻嘻嘻
    // 引入mongodb
    const MongoClient = require('mongodb').MongoClient;
    
    // Connection URL数据库连接网址
    const url = 'mongodb://localhost:27017';
    
    // Database Name数据库名,没有会自动创建
    const dbName = 'class';
    
    // Create a new MongoClient实例化这个方法
    const client = new MongoClient(url);
    
    // Use connect method to connect to the Server
    // 连接数据库
    client.connect(function(err) {
        //如果连接错误则会抛出错误,不在执行此语句的下面的语句
        if(err){
            console.log("程序运行出错,有可能你没有使用(mongod --dnpath D:/mongod/database)打开数据库")
            return;
        }
    
        // 上面的语句没有错误,则显示正确连接
        console.log("Connected successfully to server");
        // 连接database这个数据库
        const db = client.db(dbName);
    
        // ============数据库操作区域===================
        db.collection("students").insertMany([
                {"class":"高一一班","name":"花月","sex":"girl","age":19,"height":"170","weight":45},
                {"class":"高一二班","name":"紫萱","sex":"girl","age":17,"height":"168","weight":48},
                {"class":"高一三班","name":"佳宁","sex":"girl","age":20,"height":"164","weight":46},
                {"class":"高一一班","name":"香巧","sex":"girl","age":19,"height":"169","weight":50},
                {"class":"高一一班","name":"惜玉","sex":"girl","age":17,"height":"157","weight":52},
                {"class":"高一四班","name":"雅静","sex":"girl","age":16,"height":"160","weight":43},
                {"class":"高一一班","name":"玥婷","sex":"girl","age":18,"height":"162","weight":56},
                {"class":"高一四班","name":"诗琪","sex":"girl","age":19,"height":"163","weight":58},
                {"class":"高一一班","name":"欣怡","sex":"girl","age":20,"height":"164","weight":55},
                {"class":"高一一班","name":"玥怡","sex":"girl","age":19,"height":"163","weight":48},
                {"class":"高一四班","name":"梦瑶","sex":"girl","age":17,"height":"161","weight":45},
                {"class":"高一一班","name":"怜雪","sex":"girl","age":19,"height":"162","weight":46},
                {"class":"高一二班","name":"安婷","sex":"girl","age":21,"height":"163","weight":41},
                {"class":"高一五班","name":"怡瑶","sex":"girl","age":20,"height":"164","weight":52},
                {"class":"高一一班","name":"韵茹","sex":"girl","age":16,"height":"165","weight":51},
                {"class":"高一一班","name":"念蕾","sex":"girl","age":19,"height":"166","weight":43},
                {"class":"高一五班","name":"一萌","sex":"girl","age":20,"height":"160","weight":42},
                {"class":"高一一班","name":"凌旋","sex":"girl","age":21,"height":"159","weight":51},
                {"class":"高一二班","name":"芷梦","sex":"girl","age":22,"height":"171","weight":57},
                {"class":"高一一班","name":"紫夏","sex":"girl","age":15,"height":"168","weight":56},
                {"class":"高一一班","name":"芸萱","sex":"girl","age":16,"height":"165","weight":56},
                {"class":"高一五班","name":"靖瑶","sex":"girl","age":15,"height":"164","weight":48}
            ],function(err,result){
            //抛出一个错误
            if(err){
                console.log(err)
                return;
            }
            //result是所有的数据库变动信息,result以对象方式存储的,ops属性就是插入的数据
            //insertedCount属性表示插入的条目数量
            console.log("成功插入了" + result.insertedCount + "条数据");
    
            // 关闭数据库连接
            client.close();
        });
        // ============数据库操作区域===================
    
    });
    
    运行结果

    继续输入 Mongo 进入数据库的 REPL 查看插入结果:


    • 插入一条数据inserOne({},callback)
    // 引入mongodb
    const MongoClient = require('mongodb').MongoClient;
    
    // Connection URL数据库连接网址
    const url = 'mongodb://localhost:27017';
    
    // Database Name数据库名,没有会自动创建
    const dbName = 'class';
    
    // Create a new MongoClient实例化这个方法
    const client = new MongoClient(url);
    
    // Use connect method to connect to the Server
    // 连接数据库
    client.connect(function(err) {
        //如果连接错误则会抛出错误,不在执行此语句的下面的语句
        if(err){
            console.log("程序运行出错,有可能你没有使用(mongod --dnpath D:/mongod/database)打开数据库")
            return;
        }
    
        // 上面的语句没有错误,则显示正确连接
        console.log("Connected successfully to server");
        // 连接database这个数据库
        const db = client.db(dbName);
    
        // ============数据库操作区域===================
        db.collection("students").insertOne(
                {"class":"高一零班","name":"不悔","sex":"girl","age":18,"height":"165","weight":46}
            ,function(err,result){
            //抛出一个错误
            if(err){
                console.log(err)
                return;
            }
            //result是所有的数据库变动信息,result以对象方式存储的,ops属性就是插入的数据
            //insertedCount属性表示插入的条目数量
            console.log("成功插入了" + result.insertedCount + "条数据");
    
            // 关闭数据库连接
            client.close();
        });
        // ============数据库操作区域===================
    
    });
    
    插入一条数据

    查询结果:


    查询结果
    6.2、 删deleteMany({},callback)
    // 引入mongodb
    const MongoClient = require('mongodb').MongoClient;
    
    // Connection URL数据库连接网址
    const url = 'mongodb://localhost:27017';
    
    // Database Name数据库名,没有会自动创建
    const dbName = 'class';
    
    // Create a new MongoClient实例化这个方法
    const client = new MongoClient(url);
    
    // Use connect method to connect to the Server
    // 连接数据库
    client.connect(function(err) {
        //如果连接错误则会抛出错误,不在执行此语句的下面的语句
        if(err){
            console.log("程序运行出错,有可能你没有使用(mongod --dnpath D:/mongod/database)打开数据库")
            return;
        }
    
        // 上面的语句没有错误,则显示正确连接
        console.log("Connected successfully to server");
        // 连接database这个数据库
        const db = client.db(dbName);
    
        // ============数据库操作区域===================
        db.collection("students").deleteMany(
                {"class":"高一零班","name":"不悔"}
            ,function(err,result){
            //抛出一个错误
            if(err){
                console.log(err)
                return;
            }
            //deletedCount 属性表示删除的条目数量
            console.log("成功删除了" + result.deletedCount  + "条数据");
    
            // 关闭数据库连接
            client.close();
        });
        // ============数据库操作区域===================
    
    });
    

    {"class":"高一零班","name":"不悔"},删除我所有在高一零班且名叫不悔的女朋友。
    测试结果:


    再次查询
    {"class":"高一零班","name":"不悔","sex":"girl","age":18,"height":"165","weight":46}
    这个数据没了。成功删除!
    6.3、改
    • updateOne({},{$set:{}},callback) 和 replaceOne
      匹配第一个班级为高一一班的把她变性为男孩
    // ============数据库操作区域===================
        db.collection("students").replaceOne(
                {"class":"高一一班"},{"sex":"boy"}
            ,function(err,result){
            //抛出一个错误
            if(err){
                console.log(err)
                return;
            }
            console.log("成功匹配"+result.matchedCount+"个,一共修改了"+ result.modifiedCount +"个")
            // 关闭数据库连接
            client.close();
        });
        // ============数据库操作区域===================
    

    提示:以前我用 updateOne 直接修改,例如:{"class":"高一一班"},{"sex":"boy"} 这个 JSON 数据其他未改的项会消失,现在不能这么写了。会提示:

     MongoError: the update operation document must contain atomic operators
    

    这个问题查了老半天,百度的搜索结果太垃圾了。使用微软的 bing 马上得到结果:

    来源网址:
    我认为这更改为引入updateOne()方法以及update()和updateMany()的副作用,作为一种防止用户意外覆盖整个文档的安全措施。

    更改动作必须包含原子操作符;什么是原子操作符就是 $set 这种,看演示。
    我们把上面那个想不开变了性的女孩再给改回来。

    // ============数据库操作区域===================
        db.collection("students").updateOne(
                {"class":"高一一班"},{$set:{"sex":"girl"}}
            ,function(err,result){
            //抛出一个错误
            if(err){
                console.log(err)
                return;
            }
            console.log("成功匹配"+result.matchedCount+"个,一共修改了"+ result.modifiedCount +"个")
            // 关闭数据库连接
            client.close();
        });
        // ============数据库操作区域===================
    

    从结果上来看 updateOne 和 replaceOne 功能上没什么不同就是写法稍有不同。

    • 更改多个 updateMany({},{},callback)
      现在班级为高一一班的女孩全想不开非要去变性:
        // ============数据库操作区域===================
        db.collection("students").updateMany(
                {"class":"高一一班"},{$set:{"sex":"boy"}}
            ,function(err,result){
            //抛出一个错误
            if(err){
                console.log(err)
                return;
            }
            console.log("成功匹配"+result.matchedCount+"个,一共修改了"+ result.modifiedCount +"个")
            // 关闭数据库连接
            client.close();
        });
        // ============数据库操作区域===================
    

    查看输出结果:


    输出结果

    查看数据库结果:


    一共十一个
    6.4、查
    • 查询所有 find()toArray(function)
        // ============数据库操作区域===================
        db.collection("students").find().toArray(function(err,result){
            //抛出一个错误
            if(err){
                console.log(err)
                return;
            }
            console.log("成功查询了" + result.length + "条信息");
            // 查询所有的JSON将会放在result这个数组里面
            console.log(result);
            // 关闭数据库连接
            client.close();
        });
        // ============数据库操作区域===================
    

    查看输出的 22 条结果:


    输出结果
    • 且逻辑查询:(逗号表示且)
      找出年级是高一一班且年龄为16 的所有人。
    // ============数据库操作区域===================
        db.collection("students").find({"class":"高一一班","age":16}).toArray(function(err,result){
            //抛出一个错误
            if(err){
                console.log(err)
                return;
            }
            console.log("成功查询了" + result.length + "条信息");
            // 查询所有的JSON将会放在result这个数组里面
            console.log(result);
            // 关闭数据库连接
            client.close();
        });
        // ============数据库操作区域===================
    
    年级是高一一班且年龄为16
    • 大于逻辑查询
      找出身高大于 165 且体重大于 55 的人。
    // ============数据库操作区域===================
        db.collection("students").find({"height":{$gt:"165"},"weight":{$gt:55}}).toArray(function(err,result){
            //抛出一个错误
            if(err){
                console.log(err)
                return;
            }
            console.log("成功查询了" + result.length + "条信息");
            // 查询所有的JSON将会放在result这个数组里面
            console.log(result);
            // 关闭数据库连接
            client.close();
        });
        // ============数据库操作区域===================
    
    身高大于 165 且体重大于 55

    大于(gt)小于(lt)等于(eq)都是使用的原子操作符。

    • 或逻辑查找 {$or:[{},{},{}]}
      寻找年龄小于 16 或 体重小于 43 的所有人
        // ============数据库操作区域===================
        db.collection("students").find({$or:[{"age":{$lt:16}},{"weight":{$lt:43}}]}).toArray(function(err,result){
            //抛出一个错误
            if(err){
                console.log(err)
                return;
            }
            console.log("成功查询了" + result.length + "条信息");
            // 查询所有的JSON将会放在result这个数组里面
            console.log(result);
            // 关闭数据库连接
            client.close();
        });
        // ============数据库操作区域===================
    
    年龄小于 16 或 体重小于 43
    五、总结

    MongoDB REPL 常用命令:

    • 显示所有的数据库
    > show dbs
    
    • 使用某个(class)数据库
    > use class
    
    • 显示当前数据库的所有表(文档)
    > show collections
    
    • 查询当前数据对应的 student 表的数据
    > db.students.find()//find()里面可加入 JSON作为筛选条件
    
    • 给表插入一一些数据
    > db.students.insert({})
    
    • 删库
    > db.dropDatabase()
    
    • 删表
    > db.students.drop()
    
    • 导入数据库
      我再在 D:\mongodb\nodedb 新建一个 students.txt 文件,文件内容如下:
      students.txt

    打开数据库:

    >mongod --dbpath D:/mongodb/database
    

    现在往 dbs 这个数据库里面的 class 表导入我们的 students.txt 数据。

    mongoimport -d dbs -c class D:/mongodb/nodedb/students.txt
    2019-08-07T14:07:29.130+0800    connected to: localhost
    2019-08-07T14:07:29.526+0800    imported 22 documents
    
    

    -d 参数表示需要往哪个数据库中导入数据
    -c 参数表示需要往哪个集合(表)中导入数据
    提示你成功的导入了 22 条文档:
    注意的是:数据库仍然要维持开机状态。但千万不要进入REPL中输入命令mongoimport 导入命令!

    • 导出数据库
    mongoexport -d dbs -c class -o 1.txt
    

    其中 -o 是 output 的意思。


    前面没讲 MongoDB 的优点。 MongoDB 是非结构型数据库。比 SQL 的地方在于不限制字段,每个条目(MongoDB中称为文档,一个文档就是一个标准JSON)都可以有自己的字段。而我们在操作数据用到最多的就是 JSON 格式的数据。
    完。。。

    相关文章

      网友评论

        本文标题:MongoDB 芒果数据库的使用

        本文链接:https://www.haomeiwen.com/subject/uzrwdctx.html