第31章 Node.js 连接 MongoDB教程

第31章 Node.js 连接 MongoDB教程

MongoDB是一种文档导向database管理系统,由C++撰写而成。

本章节咱们将为大家介绍如何使用 Node.js 来连接 MongoDB,并对database进行操作。

如果仁兄还没有 MongoDB 的基本知识,可以参考咱们的教程:MongoDB 教程。

install 驱动

本教程使用了淘宝定制的 cnpm 命令进行install :


    $ cnpm install mongodb

接下来咱们来实现增删改查功能。


创建database

要在 MongoDB 中创建一个database,首先咱们需要创建一个 MongoClient 对象,然后配置好指定的 URL 和 端口号。

如果database不存在,MongoDB 将创建database并建立连接。


    创建连接 
     
    
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/liulianjiangcsdn";
     
    MongoClient.connect(url, function(err, db) {
      if (err) throw err;
      console.log("database已创建!");
      db.close();
    });


创建集合

咱们可以使用 createCollection() 方法来创建集合:


    创建集合 
     
    
    var MongoClient = require('mongodb').MongoClient;
    var url = 'mongodb://localhost:27017/liulianjiangcsdn';
    MongoClient.connect(url, function (err, db) {
        if (err) throw err;
        console.log('database已创建');
        var dbase = db.db("liulianjiangcsdn");
        dbase.createCollection('site', function (err, res) {
            if (err) throw err;
            console.log("创建集合!");
            db.close();
        });
    });


database操作( CURD )

与 MySQL 不同的是 MongoDB 会自动创建database和集合,所以使用前咱们不需要手动去创建。

插入数据

以下实例咱们连接database liulianjiangcsdn 的 site 表,并插入一条数据条数据,使用 insertOne():


    插入一条数据 
     
    
    
     执行以下命令输出就结果请在输出结果查看
     
     ```sql 
    $ node test.js
    文档插入成功
     ```
    
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("liulianjiangcsdn");
        var myobj = { name: "liulianjiangcsdn教程", url: "www.liulianjiangcsdn" };
        dbo.collection("site").insertOne(myobj, function(err, res) {
            if (err) throw err;
            console.log("文档插入成功");
            db.close();
        });
    });

从输出结果来看,数据已插入成功。

咱们也可以打开 MongoDB 的客户端查看数据,如:


    > show dbs
    liulianjiangcsdn  0.000GB          # 自动创建了 liulianjiangcsdn database
    > show tables
    site                     # 自动创建了 site 集合(数据表)
    > db.site.find()
    { "_id" : ObjectId("5a794e36763eb821b24db854"), "name" : "liulianjiangcsdn教程", "url" : "www.liulianjiangcsdn" }
    >

如果要插入多条数据可以使用 insertMany():


    插入多条数据 
     
    
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("liulianjiangcsdn");
        var myobj =  [
            { name: 'liulianjiangcsdntool ', url: 'https://c.blog.csdn.net/qq441540598', type: 'cn'},
            { name: 'Google', url: 'https://www.google.net', type: 'en'},
            { name: 'Facebook', url: 'https://www.google.net', type: 'en'}
           ];
        dbo.collection("site").insertMany(myobj, function(err, res) {
            if (err) throw err;
            console.log("插入的文档数量为: " + res.insertedCount);
            db.close();
        });
    });

res.insertedCount 为插入的条数。

查询数据

可以使用 find() 来查找数据, find() 可以return 匹配条件的所有数据。 如果未指定条件,find() return 集合中的所有数据。


    find() 
     
    
    
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("liulianjiangcsdn");
        dbo.collection("site"). find({}).toArray(function(err, result) { // return 集合中所有数据
            if (err) throw err;
            console.log(result);
            db.close();
        });
    });

以下实例检索 name 为 “liulianjiangcsdn教程” 的实例:


    查询指定条件的数据 
     
    
    
     执行以下命令输出就结果请在输出结果查看
     
     ```sql 
    [ { _id: 5a794e36763eb821b24db854,
        name: 'liulianjiangcsdn教程',
        url: 'www.liulianjiangcsdn' } ]
     ```
    
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("liulianjiangcsdn");
         var whereStr = {"name":'liulianjiangcsdn教程'};  // 查询条件
        dbo.collection("site").find(whereStr).toArray(function(err, result) {
            if (err) throw err;
            console.log(result);
            db.close();
        });
    });

更新数据

咱们也可以对database的数据进行修改,以下实例将 name 为 “liulianjiangcsdn教程” 的 url 改为 https://blog.csdn.net/qq441540598:


    更新一条数据 
     
    
    
     执行成功后,进入 mongo 管理tool 查看数据已修改:
     
     ```sql 
    > db.site.find().pretty()
    {
        "_id" : ObjectId("5a794e36763eb821b24db854"),
        "name" : "liulianjiangcsdn教程",
        "url" : "https://blog.csdn.net/qq441540598"     // 已修改为 https
    }
     ```
    
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("liulianjiangcsdn");
        var whereStr = {"name":'liulianjiangcsdn教程'};  // 查询条件
        var updateStr = {$set: { "url" : "https://blog.csdn.net/qq441540598" }};
        dbo.collection("site").updateOne(whereStr, updateStr, function(err, res) {
            if (err) throw err;
            console.log("文档更新成功");
            db.close();
        });
    });

如果要更新所有符合条的文档数据可以使用 updateMany():


    更新多条数据 
     
    
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("liulianjiangcsdn");
        var whereStr = {"type":'en'};  // 查询条件
        var updateStr = {$set: { "url" : "https://blog.csdn.net/qq441540598" }};
        dbo.collection("site").updateMany(whereStr, updateStr, function(err, res) {
            if (err) throw err;
             console.log(res.result.nModified + " 条文档被更新");
            db.close();
        });
    });

result.nModified 为更新的条数。

删除数据

以下实例将 name 为 “liulianjiangcsdn教程” 的数据删除 :


    删除一条数据 
     
    
    
     执行成功后,进入 mongo 管理tool 查看数据已删除:
     
     ```sql 
    > db.site.find()
    > 
     ```
    
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("liulianjiangcsdn");
        var whereStr = {"name":'liulianjiangcsdn教程'};  // 查询条件
        dbo.collection("site").deleteOne(whereStr, function(err, obj) {
            if (err) throw err;
            console.log("文档删除成功");
            db.close();
        });
    });

如果要删除多条语句可以使用 deleteMany() 方法

以下实例将 type 为 en 的所有数据删除 :


    删除多条数据 
     
    
    
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("liulianjiangcsdn");
        var whereStr = { type: "en" };  // 查询条件
        dbo.collection("site").deleteMany(whereStr, function(err, obj) {
            if (err) throw err;
            console.log(obj.result.n + " 条文档被删除");
            db.close();
        });
    });

obj.result.n 删除的条数。

排序

排序 使用 sort() 方法,该方法接受一个参数,规定是升序(1)还是降序(-1)。

例如:


    { type: 1 }  // 按 type 字段升序
    { type: -1 } // 按 type 字段降序

按 type 升序排列:


    排序 
     
    
    
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("liulianjiangcsdn");
        var mysort = { type: 1 };
        dbo.collection("site").find().sort(mysort).toArray(function(err, result) {
            if (err) throw err;
            console.log(result);
            db.close();
        });
    });

查询分页

如果要设置指定的return 条数可以使用 limit() 方法,该方法只接受一个参数,指定了return 的条数。


    limit():读取两条数据 
     
    
    
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("liulianjiangcsdn");
        dbo.collection("site").find().limit(2).toArray(function(err, result) {
            if (err) throw err;
            console.log(result);
            db.close();
      });
    });

如果要指定跳过的条数,可以使用 skip() 方法。


    skip(): 跳过前面两条数据,读取两条数据 
     
    
    
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("liulianjiangcsdn");
        dbo.collection("site").find().skip(2).limit(2).toArray(function(err, result) {
            if (err) throw err;
            console.log(result);
            db.close();
      });
    });

连接操作

mongoDB 不是一个关系型database,但咱们可以使用 $lookup 来实现左连接。

例如咱们有两个集合数据分别为:

集合1:orders


    [
      { _id: 1, product_id: 154, status: 1 }
    ]

集合2:products


    [
      { _id: 154, name: '笔记本电脑' },
      { _id: 155, name: '耳机' },
      { _id: 156, name: '台式电脑' }
    ]


    $lookup 实现左连接 
     
    
    
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://127.0.0.1:27017/";
     
    MongoClient.connect(url, function(err, db) {
      if (err) throw err;
      var dbo = db.db("liulianjiangcsdn");
      dbo.collection('orders').aggregate([
        { $lookup:
           {
             from: 'products',            // 右集合
             localField: 'product_id',    // 左集合 join 字段
             foreignField: '_id',         // 右集合 join 字段
             as: 'orderdetails'           // 新生成字段(类型array)
           }
         }
        ]).toArray(function(err, res) {
        if (err) throw err;
        console.log(JSON.stringify(res));
        db.close();
      });
    });

删除集合

咱们可以使用 drop() 方法来删除集合:


    drop() 
     
    
    
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("liulianjiangcsdn");
        // 删除 test 集合
        dbo.collection("test").drop(function(err, delOK) {  // 执行成功 delOK return  true,否则return  false
            if (err) throw err;
            if (delOK) console.log("集合已删除");
            db.close();
        });
    });


使用 Promise

Promise 是一个 ECMAScript 6 提供的类,目的是更加优雅地书写复杂的异步任务。

如果仁兄还不了解 Promise,可以参考 JavaScript Promise

以下实例使用 Promise 创建集合:


    实例 const MongoClient = require("mongodb").MongoClient;
    const url = "mongodb://localhost/liulianjiangcsdn";
    MongoClient.connect(url).then((conn) => {
        console.log("database已连接");
        var dbase = conn.db("liulianjiangcsdn");
        dbase.createCollection("site").then((res) => {
            console.log("已创建集合");
        }).catch((err) => {
            console.log("database操作错误");
        }).finally(() => {
            conn.close();
        });
    }).catch((err) => {
        console.log("database连接失败");
    });

Promise 数据操作

现在咱们在一个程序中实现四个连续操作:增加 、查询 、更改 、删除。


    实例 const MongoClient = require("mongodb").MongoClient;
    const url = "mongodb://localhost/";
    MongoClient.connect(url).then((conn) => {
        console.log("database已连接");
        const test = conn.db("testdb").collection("test");
        // 增加
        test.insertOne({ "site": "blog.csdn.net/qq441540598" }).then((res) => {
            // 查询
            return test.find().toArray().then((arr) => {
                console.log(arr);
            });
        }).then(() => {
            // 更改
            return test.updateMany({ "site": "blog.csdn.net/qq441540598" },
                { $set: { "site": "example.net" } });
        }).then((res) => {
            // 查询
            return test.find().toArray().then((arr) => {
                console.log(arr);
            });
        }).then(() => {
            // 删除
            return test.deleteMany({ "site": "example.net" });
        }).then((res) => {
            // 查询
            return test.find().toArray().then((arr) => {
                console.log(arr);
            });
        }).catch((err) => {
            console.log("数据操作失败" + err.message);
        }).finally(() => {
            conn.close();
        });
    }).catch((err) => {
        console.log("database连接失败");
    });

执行结果请在输出结果查看


    database已连接
    [ { _id: 5f1664966833e531d83d3ac6, site: 'blog.csdn.net/qq441540598' } ]
    [ { _id: 5f1664966833e531d83d3ac6, site: 'example.net' } ]
    []

用异步函数实现相同的数据操作


    实例 const MongoClient = require("mongodb").MongoClient;
    const url = "mongodb://localhost/";
     
    async function dataOperate() {
        var conn = null;
        try {
            conn = await MongoClient.connect(url);
            console.log("database已连接");
            const test = conn.db("testdb").collection("test");
            // 增加
            await test.insertOne({ "site": "blog.csdn.net/qq441540598" });
            // 查询
            var arr = await test.find().toArray();
            console.log(arr);
            // 更改
            await test.updateMany({ "site": "blog.csdn.net/qq441540598" },
                { $set: { "site": "example.net" } });
            // 查询
            arr = await test.find().toArray();
            console.log(arr);
            // 删除
            await test.deleteMany({ "site": "example.net" });
            // 查询
            arr = await test.find().toArray();
            console.log(arr);
        } catch (err) {
            console.log("错误:" + err.message);
        } finally {
            if (conn != null) conn.close();
        }
    }
     
    dataOperate();

运行结果请在输出结果查看


    database已连接
    [ { _id: 5f169006a2780f0cd4ea640b, site: 'blog.csdn.net/qq441540598' } ]
    [ { _id: 5f169006a2780f0cd4ea640b, site: 'example.net' } ]
    []

运行结果完全一样。

很显然,异步函数是一种非常良好的编程风格,在多次使用异步操作的时候非常实用。

但是请勿在低于 7.6.0 版本的 node.js 上使用异步函数。

本专栏所有文章

第1章 MongoDB 教程第2章 NoSQL 简介教程
第3章 MongoDB 简介教程第4章 Windows MongoDB教程
第5章 Linux MongoDB教程第6章 OSX MongoDB教程
第7章 MongoDB 概念解析教程第8章 MongoDB 连接教程
第9章 MongoDB 创建数据库教程第10章 MongoDB 删除数据库教程
第11章 MongoDB 创建集合教程第12章 MongoDB 删除集合教程
第13章 MongoDB 插入文档教程第14章 MongoDB 更新文档教程
第15章 MongoDB 删除文档教程第16章 MongoDB 查询文档教程
第17章 MongoDB 条件操作符教程第18章 MongoDB $type 操作符教程
第19章 MongoDB Limit与Skip方法教程第20章 MongoDB 排序教程
第21章 MongoDB 索引教程第22章 MongoDB 聚合教程
第23章 MongoDB 复制(副本集)教程第24章 MongoDB 分片教程
第25章 MongoDB 备份与恢复教程第26章 MongoDB 监控教程
第27章 MongoDB Java教程第28章 MongoDB PHP 扩展教程
第29章 MongoDB PHP教程第30章 MongoDB PHP7教程
第31章 Node.js MongoDB教程第32章 MongoDB 关系教程
第33章 MongoDB 数据库引用教程第34章 MongoDB 覆盖索引查询教程
第35章 MongoDB 查询分析教程第36章 MongoDB 原子操作教程
第37章 MongoDB 高级索引教程第38章 MongoDB 索引限制教程
第39章 MongoDB ObjectId教程第40章 MongoDB Map Reduce教程
第41章 MongoDB 全文检索教程第42章 MongoDB 正则表达式教程
第43章 MongoDB 管理工具教程第44章 MongoDB GridFS教程
第45章 MongoDB 固定集合教程第46章 MongoDB 自动增长教程

寄语

本文有榴莲酱CSDN原创,欢迎点赞、转载,博客地址:https://blog.csdn.net/qq441540598

  • 懊悔自己的错失而不至于重犯,才是真实的悔悟。
  • 生活总会有无尽的麻烦,但请不要无奈,因为路还在,梦还在,阳光还在,我们还在,什么事情都会过去的。
  • 我们必须作为思索的人而行动,作为行动的人而思索。
  • 穿马路是左右看,用家电是看插头,用火是要细心,平平安安过生活。
  • 不要企求清冷而遥远的星光来照耀人生,让自己的太阳升起来,这样才会有一生的光明。

检索教程|第42章 MongoDB 正则表达式教程|
|第43章 MongoDB 管理工具教程|第44章 MongoDB GridFS教程|
|第45章 MongoDB 固定集合教程|第46章 MongoDB 自动增长教程|

寄语

本文有榴莲酱CSDN原创,欢迎点赞、转载,博客地址:https://blog.csdn.net/qq441540598

  • 懊悔自己的错失而不至于重犯,才是真实的悔悟。
  • 生活总会有无尽的麻烦,但请不要无奈,因为路还在,梦还在,阳光还在,我们还在,什么事情都会过去的。
  • 我们必须作为思索的人而行动,作为行动的人而思索。
  • 穿马路是左右看,用家电是看插头,用火是要细心,平平安安过生活。
  • 不要企求清冷而遥远的星光来照耀人生,让自己的太阳升起来,这样才会有一生的光明。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榴莲酱csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值