上一篇【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
所以我们要先获取数据库对象,然后获取集合对象,然后插入数据。这里我们使用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打印。
如果要返回字符串(比如接口的响应),那么我们需要利用JSON来编码一下:
res.end(JSON.stringify(result));
(关于JavaScript的JSON使用就不细了)
如果我们单次查询不存在,那么result对象会返回什么呢?
答案是null而不是undefined,这点在编程时要特地做一下判断。。。
使用find
方法而不是findOne
,可以返回匹配到的所有数据。
值得注意的是,这时候返回的result是一个cursor对象,不能直接使用,我们需要使用.toArray方法,才能获取对象数组。具体用法如下:
代码
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");
有时候一条记录数据非常多,我们只需要返回我们需要的数据,那么我们需要通过project方法,在查询返回字段上限制。
和toArray类似,我们加上project的限制。我们只要uid字段,其他不要(注意 _id 需要特殊处理一下)
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");
值得注意的是,find操作才能用 project 方法,而findOne操作则不行。如果需要返回记录的指定字段,那么需要加上limit,具体用法:
还是使用上述 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() // 操作第一条匹配的