MongoDB

Node.js MongoDB数据库免费看

安装MongoDB驱动程序、使用Node.js连接MongoDB数据库、创建集合、删除集合等等

2020-04-22侠课岛    基础入门       

后端/Node.js/Node.js简明入门 9     0     733

前面一节我们讲了使用Node.js连接MySQL数据库,本节我们讲一下如何使用Node.js 来连接MongoDB数据库。

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。有关于MongoDB数据库的详细介绍,我们可以看一下MongoDB 教程。

安装MongoDB驱动程序

想要使用 Node.js 来访问 MongoDB 数据库,需要下载安装 MongoDB 驱动程序,命令如下所示。

npm install mongodb

安装好mongodb驱动后,就可以通过 require() 方法来引入这个驱动:

var mongo = require('mongodb');

使用Node.js连接MongoDB数据库

要使用Node.js连接MongoDB数据库,首先得引入我们安装好mongodb驱动。然后用过 MongoClient 连接池创建一个MongoClient 对象。使用正确的IP地址和要创建的数据库名称指定连接URL。

示例:

我们创建一个与mondb数据库的连接:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mondb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;
    console.log("连接成功!");
    db.close();
});

启动文件:

连接成功!

如果数据库不存在,MongoDB 将创建该数据库并建立连接。

创建集合

MongoDB中的集合也相当于一个表,在MySQL中的表在MongoDB中被称为集合。
通过Node.js连接好数据库后,我们可以使用 createCollection() 方法来创建集合。

示例:

例如我们在数据库中创建一个名为montable的集合,如下所示:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mondb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;

    var dbo = db.db("mondb");
    dbo.createCollection("montable", function(err, res) {
      if (err) throw err;
      console.log("集合创建成功!");
      db.close();
    });
});

启动文件:

集合创建成功!

删除集合

如果我们创建好集合后,又不想要这个集合了,可以删除集合。MongoDB 中可以使用 drop() 方法删除集合。这个方法采用一个包含错误对象和 result 参数的回调函数,如果成功删除该集合,则返回true,否则返回false。

示例:

例如我们删除上面创建的集合montable:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mondb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;

    var dbo = db.db("mondb");
    dbo.collection("montable").drop(function(err, del) {
        if (err) throw err;
        if (del) console.log("集合删除成功!");
        db.close();
    });
});

启动文件:

集合删除成功!

如果集合不存在,那么执行代码后,会报错:

除此之外,dropCollection()方法也可以用于删除集合,该方法具有两个参数,集合的名称和回调函数。

示例:
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mondb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;

    var dbo = db.db("mondb");
    dbo.dropCollection("montable", function(err, del) {
        if (err) throw err;
        if (del) console.log("集合删除成功!");
        db.close();
    });
});

启动文件:

集合删除成功!

插入文档

MongoDB 和 MySQL不同的地方在于,MongoDB 会自动创建数据库和集合,所以我们可以不需要手动创建数据库和集合,直接向集合插入文档。这个文档就相当于MySQL中的记录的意思。

向集合中插入数据可以使用 insertOne() 方法,该方法的第一个参数是一个对象,该对象包含要插入的文档中每个字段的名称和值。

示例:

向名为 xkd 的集合中插入一个文档:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mondb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;

    var dbo = db.db("mondb");
    var sql = { _id:1, name: "Anna", city: "beijing" };
    dbo.collection("xkd").insertOne(sql, function(err, res) {
        if (err) throw err;
        console.log("文档插入成功!");
        db.close();
    });
});

启动文件:

文档插入成功!

大家发现没有,xkd这个集合我们并没有创建过,但是向这个集合中插入文档时,执行结果告诉我们文档插入成功。所以这就是MongoDB和MySQL的不同了,当集合(表)不存在时,MongoDB会创建集合并插入数据,而MySQL则会报错,告诉我们这个表不存在。

要将多个文档插入MongoDB的集合中,可以使用insertMany()方法。该方法的第一个参数是对象数组,其中包含要插入的数据。

示例:

例如我们想要向 xkd 集合中插入多个文档,如下所示:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mondb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;

    var dbo = db.db("mondb");
    var sql = [
        { _id:2, name: "BB", city: "xiamen" },
        { _id:3, name: "KK", city: "wuhan" },
        { _id:4, name: "Cindy", city: "chengdu" }
    ];
    dbo.collection("xkd").insertMany(sql, function(err, res) {
        if (err) throw err;
        console.log(res.insertedCount + "个文档被成功插入!");
        db.close();
    });
});

启动文件:

3个文档被成功插入!

insertMany 方法的回调函数中,我们使用了insertedCount属性来输出成功插入文档的记录数,执行结果告诉我们成功插入了3个文档。

_id字段

这里我们再提一下_id字段,在 MongoDB 数据库中,如果我们没有特意为 _id 字段指定值,那么 MongoDB 将会自动添加一个字段并为每个文档分配唯一的ID。如果自己指定_id字段,则每个文档的 _id 字段也必须是唯一的,也就是如果第一个文档的_id字段为1,那么后面的文档就不可以再将_id指定为1,只能是2、3、4、5....

查询文档

在MongoDB中,我们可以使用 find()findOne() 方法来查找集合中的数据。

  • findOne() 方法仅返回选择中的第一个匹配项。
示例:

如下所示,查询 xkd 集合中的的第一个文档的 name 字段:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mondb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;

    var dbo = db.db("mondb");

    dbo.collection("xkd").findOne({}, function(err, result) {
        if (err) throw err;
        console.log("查询结果:"+ '\n' + result.name);
        db.close();
    });
});

启动文件:

查询结果:
Anna

因为我们仅查询了文档中的name字段,所以输出结果只有第一个文档中的name字段的值,即"Anna"。

  • find() 方法返回集合中的所有匹配项。第一个参数是查询对象。
示例:

如下所示,使用一个空的查询对象,查询集合中的所有文档:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mondb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;

    var dbo = db.db("mondb");
    dbo.collection("xkd").find({}).toArray(function(err, result) {
        if (err) throw err;
        console.log(result);
        db.close();
    });
});

启动文件,输出如下所示内容:

find() 方法的第二个参数 projection 描述想要在查询结果中包括哪些字段的对象。

示例:

例如我们只需要查询集合中的name字段和city字段:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mondb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;

    var dbo = db.db("mondb");
    dbo.collection("xkd").find({}, {projection: { _id: 0, name: 1, city: 1}}).toArray(function(err, result) {
        if (err) throw err;
        console.log(result);
        db.close();
    });
});

启动文件,显示内容如下所示:

projection 中的0表示不查询,1表示查询。上述代码中_id 字段为0,表示不查询,name 和 city字段为1,表示查询。

需要注意的是不允许在同一个对象中同时指定0和1,除非其中一个字段为 _id 字段。要排除 _id 必须将其设置为0。假设现在有五个字段,只设置了其中一个字段为0,那么其他字段默认为1。

筛选结果

在集合中查找文档时,可以使用查询对象过滤结果。find()方法的第一个参数是查询对象,可以用于限制搜索。

示例:

查找xkd集合中name为 “KK” 的文档:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mondb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;

    var dbo = db.db("mondb");
    var query = { name: "KK" };
    dbo.collection("xkd").find(query).toArray(function(err, result) {
        if (err) throw err;
        console.log(result);
        db.close();
    });
});

启动文件:

[ { _id: 3, name: 'KK', city: 'wuhan' } ]

除此之外,正则表达式也可以用于查询过滤。

示例:

查询xkd集合中,以字母 K 开头的文档,find方法中的参数 query 为正则表达式 :

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mondb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;

    var dbo = db.db("mondb");
    var query = { name: /^K/ };
    dbo.collection("xkd").find(query).toArray(function(err, result) {
        if (err) throw err;
        console.log(result);
        db.close();
    });
});

启动文件:

[ { _id: 3, name: 'KK', city: 'wuhan' } ]

sort排序

在 MongoDB 中可以使用 sort() 方法来对结果进行排序。参数为要排序的对象。值为1时表示升序,-1表示降序。

示例:

按name字段的字母顺序结果进行降序排序:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mondb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;

    var dbo = db.db("mondb");
    var mysort = { name:-1 };
    dbo.collection("xkd").find().sort(mysort).toArray(function(err, result) {
        if (err) throw err;
        console.log(result);
        db.close();
    });
});

启动文件:

[ { _id: 3, name: 'KK', city: 'wuhan' },
  { _id: 4, name: 'Cindy', city: 'chengdu' },
  { _id: 2, name: 'BB', city: 'xiamen' },
  { _id: 1, name: 'Anna', city: 'beijing' } ]

删除文档

  • deleteOne()方法用于删除 MongoDB 中的文档。方法中第一个参数是一个查询对象,用于定义要删除的文档。如果查询找到多个文档,则仅删除第一次出现的文档。
示例:

删除 xkd 集合中字段 city 为 "wuhan" 的文档:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mondb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;

    var dbo = db.db("mondb");
    var query = { city:'wuhan' };
    dbo.collection("xkd").deleteOne(query, function(err, result) {
        if (err) throw err;
        console.log("删除成功!");
        db.close();
    });
});

启动文件:

删除成功!
  • deleteMany()方法用于删除多个文档。方法中第一个参数是一个查询对象,用于定义要删除的文档。
示例:

删除 city 字段以字母 X 开头的所有文档:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mondb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;

    var dbo = db.db("mondb");
    var query = { city:/^X/ };
    dbo.collection("xkd").deleteMany(query, function(err, obj) {
        if (err) throw err;
        console.log(obj.result.n + "条文档删除成功!");
        db.close();
    });
});

启动文件:

0条文档删除成功!  

这里为什么会显示"0条文档删除成功"呢,这是因为集合中 city 字段没有以 "X" 开头的值。

更新文档

  • updateOne()方法可以用于更新集合中的文档,该第一个参数是一个查询对象,用于定义要更新的文档。如果查询找到多个记录,则仅更新第一个记录。
示例:

将集合中满足 city 字段值为 "BB"的文档 ,更新为name为"侠课岛", city为"长沙":

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mondb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;

    var dbo = db.db("mondb");
    var query = { name: "BB" };
    var newquery = {$set: {name:"侠课岛", city:"长沙"}}
    dbo.collection("xkd").updateOne(query, newquery, function(err, res) {
        if (err) throw err;
        if (res) console.log("修改成功!");
        db.close();
    });
});

启动文件:

修改成功!

上述代码中 $set 运算符用于更新指定字段。为了验证,我们可以查看一下集合中文档,如下所示,第二个文档的数据成功被修改:

  • updateMany()方法可以用于更新所有符合查询条件的文档。
示例:

将所有以字母 A 开头的文档中的 city 字段更新为"哈鲁木齐":

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mondb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;

    var dbo = db.db("mondb");
    var query = { name: /^A/ };
    var newquery = {$set: {city:"哈鲁木齐"}}
    dbo.collection("xkd").updateMany(query, newquery, function(err, res) {
        if (err) throw err;
        console.log(res.result.nModified + "个文档修改成功!");
        db.close();
    });
});

启动文件:

1个文档修改成功!

我们查看xkd集合看一下文档是否成功被修改:

limit限制

limit() 方法可以限制 MongoDB 中的结果,该方法有一个参数,就是返回的文档数。

示例:

查询 xkd 集合中前2条文档:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mondb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;

    var dbo = db.db("mondb");
    dbo.collection("xkd").find().limit(2).toArray(function(err, result) {
        if (err) throw err;
        console.log(result);
        db.close();
    });
});

启动文件,显示结果如下所示:

[
  { _id: 1, name: 'Anna', city: '哈鲁木齐' },
  { _id: 2, name: '侠课岛', city: '长沙' }
]

本教程图文或视频等内容版权归侠课岛所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、转贴或以其他方式复制发布或发表。

评价

9

本课评分:
  •     非常好
难易程度:
  •     适中的

内容目录


本文索引


|
教程
粉丝
主页

签到有礼

已签到2天,连续签到7天即可领取7天全站VIP

  • 1
    +2 金币
  • 2
    +3 金币
  • 3
    +5 金币
  • 6
    +7 金币
  • 5
    +6 金币
  • 4
    暖心福利
    自选分类VIP ×1天
  • 7
    惊喜大礼

    自选分类VIP ×3天 +20金币
  • 持续签到 +8 金币

金币可以用来做什么?