node.js使用mongodb驱动常见操作总结(增删查改)

目录

  • 前言
  • 安装
  • 异步操作
  • 创建数据库 / 集合
  • 插入数据
  • 查询数据
    • 单条查询
    • 单条查询不存在的情况
    • 多条查询
    • 返回指定字段
      • 只查一个?
    • 多条查询为空
  • 更新
  • 删除

前言

上一篇【python mongodb驱动 pymongo模块常见用法总结】记到如何通过python驱动mongodb,今天来学习如何通过node.js驱动mongodb。

安装

使用node自带的包管理工具npm即可很快的安装。

npm install mongodb

如果运行时报错说没找到mongodb这个模块,那么我们可以通过在当前.js文件目录下运行

npm link mongodb 

来将包导入(其实就是复制一份到当前文件夹了。。)

异步操作

值得注意的是,node是单线程服务器,所有的操作都是异步+回调来完成的,这意味着我们使用mongodb驱动,也要以异步的形式来操作。比如最简单的连接到数据库的操作,也是异步。。

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/runoob";
 
MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
  // 连接到数据库之后执行该部分代码
});

虽然这很蛋疼,但是异步能够提升服务器的性能 至于怎么避开大量的回调,这个我们下回分解 下次一定

创建数据库 / 集合

和python的mongodb驱动一样,如果往不存在的数据库或者集合中插入数据,那么他们会被自动创建。这是好的,所以我们就掠过这个内容。

插入数据

连接到数据库,我们会获得一个db对象,值得注意的是,这个对象是在回调函数中传递回来的,所以我们对db对象的操作,可以在回调函数中进行。

db对象包含所有的数据库,和怕python的mongodb驱动一样,这是一张巨大的map

MongoCilent
数据库1
数据库2
集合1
集合2

所以我们要先获取数据库对象,然后获取集合对象,然后插入数据。这里我们使用express框架的写法。

使用 集合对象.insertOne() 方法插入一条记录。因为是node.js,所以操作和mongodb的js控制台无异。我们基本可以沿用。值得注意的是,插入数据也有回调函数。我们可以在回调函数中完成一些操作,比如返回“插入成功

var express = require('express');
var app = express();

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

// 中间件
var mw = function(req, res, next) {
    MongoClient.connect(url, { useUnifiedTopology: true }, function(err, db) {
        if (err) throw err;
        var test= db.db("test");	// 获取数据库对象
        var testCol = test.collection("testCollection");	// 获取集合对象

        var data = {
            "username": "ddykz",
            "password": "123456" ,
            "uid": 114514,
            "balance": -8000
        };

        // 插入数据
        testCol.insertOne(data, function(err, result) {
            if (err) throw err;
            res.end("插入成功");
        });
    });
};

app.get('/test', mw);

app.listen(8888);
console.log("开始运行于 localhost:8888");

然后浏览器访问http://localhost:8888/test可以看到插入成功(第一次查询无数据,第二次查询发现有数据)

在这里插入图片描述
和pymongo一样,如果传入的对象是数组,那么我们可以通过调用 集合对象.insertMany()插入多条数据。这里就不演示了

查询数据

单条查询

通过调用集合对象.findOne()方法可以查询单条数据。传入的参数是where条件对象。下面演示查询 username=ddykz 的用户

var express = require('express');
var app = express();

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

var mw = function(req, res, next) {
    MongoClient.connect(url, { useUnifiedTopology: true }, function(err, db) {
        if (err) throw err;
        var test= db.db("test");	// 获取数据库对象
        var testCol = test.collection("testCollection");	// 获取集合对象

        // 查询条件
        var where = {
            "username": "ddykz",
        };

        // 查询数据
        testCol.findOne(where, function(err, result) {
            if (err) throw err;
            console.log(result);
            res.end(JSON.stringify(result));
        });
    });
};

app.get('/test', mw);

app.listen(8888);
console.log("开始运行于 localhost:8888");

注意:findOne 函数的result是查询结果,它直接返回这个对象,我们可以通过console.log打印。
node.js使用mongodb驱动常见操作总结(增删查改)_第1张图片
如果要返回字符串(比如接口的响应),那么我们需要利用JSON来编码一下:

res.end(JSON.stringify(result));

(关于JavaScript的JSON使用就不细了)

在这里插入图片描述

单条查询不存在的情况

如果我们单次查询不存在,那么result对象会返回什么呢?
在这里插入图片描述
答案是null而不是undefined,这点在编程时要特地做一下判断。。。

多条查询

使用find方法而不是findOne,可以返回匹配到的所有数据。

值得注意的是,这时候返回的result是一个cursor对象,不能直接使用,我们需要使用.toArray方法,才能获取对象数组。具体用法如下:
node.js使用mongodb驱动常见操作总结(增删查改)_第2张图片
代码

var express = require('express');
var app = express();

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

var mw = function(req, res, next) {
    MongoClient.connect(url, { useUnifiedTopology: true }, function(err, db) {
        if (err) throw err;
        var test= db.db("test");	// 获取数据库对象
        var testCol = test.collection("testCollection");	// 获取集合对象

        // 查询数据 使用toArray方法
        testCol.find({}).toArray(function(err, result) {
            if (err) throw err;
            console.log(result);
            res.end(JSON.stringify(result));
        });
    });
};

app.get('/test', mw);

app.listen(8888);
console.log("开始运行于 localhost:8888");

node.js使用mongodb驱动常见操作总结(增删查改)_第3张图片

返回指定字段

有时候一条记录数据非常多,我们只需要返回我们需要的数据,那么我们需要通过project方法,在查询返回字段上限制。

和toArray类似,我们加上project的限制。我们只要uid字段,其他不要(注意 _id 需要特殊处理一下)

node.js使用mongodb驱动常见操作总结(增删查改)_第4张图片
代码

var express = require('express');
var app = express();

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

var mw = function(req, res, next) {
    MongoClient.connect(url, { useUnifiedTopology: true }, function(err, db) {
        if (err) throw err;
        var test= db.db("test");	// 获取数据库对象
        var testCol = test.collection("testCollection");	// 获取集合对象

        var need = {
            "_id": 0 ,  // 不要_id 这个需要特殊处理
            "uid": 1    // 只要uid
        };

        // 查询数据
        testCol.find({}).project(need).toArray(function(err, result) {
            if (err) throw err;
            console.log(result);
            res.end(JSON.stringify(result));
        });
    });
};

app.get('/test', mw);

app.listen(8888);
console.log("开始运行于 localhost:8888");

现在程序的返回值的对象数组中,每个对象就只有uid字段了
在这里插入图片描述

只查一个?

值得注意的是,find操作才能用 project 方法,而findOne操作则不行。如果需要返回记录的指定字段,那么需要加上limit,具体用法:

node.js使用mongodb驱动常见操作总结(增删查改)_第5张图片

多条查询为空

还是使用上述 find + toArray 进行查询。如果结果为空,那么最后result会是 空数组 而不是null。这要特别注意!!!
在这里插入图片描述
和单次查询不太一样,要注意。

更新

更新字段的操作也和mongodb的js控制台操作类似。通过集合对象.updateOne 可以进行一次更新,分别传入条件对象where和新赋值对象value即可实现。

var express = require('express');
var app = express();

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

var mw = function(req, res, next) {
    MongoClient.connect(url, { useUnifiedTopology: true }, function(err, db) {
        if (err) throw err;
        var test= db.db("test");	// 获取数据库对象
        var testCol = test.collection("testCollection");	// 获取集合对象

        var where = {
            "username": "ddykz"
        };

        var value = {
            "$set": {
                "uid": 123    // 将uid字段改为123
            }
        };

        // 查询数据
        testCol.updateOne(where, value, function(err, result) {
            if (err) throw err;
            console.log(result.matchedCount);	// 返回影响到的条数
            res.end("成功");
        });
    });
};

app.get('/test', mw);

app.listen(8888);
console.log("开始运行于 localhost:8888");

在这里插入图片描述
值得注意的是,返回的result仍然是一个cursor对象,我们调用其 matchedCount 属性可以查看匹配到的条数,而实际更新的记录数目则在 nModified 属性中。

在这里插入图片描述
注意:update会更新所有匹配到的数据,而updateOne只更新第一条。

删除

和 update 基本相同,就不细了

update() --> deleteMany()		// 操作所有匹配的记录
updateOnce() --> deleteOne()	// 操作第一条匹配的

你可能感兴趣的:(nodejs,js,mongodb,nodejs,数据库)