前述:
最近在项目中用到了mongodb,然后在查阅资料的过程中,就感觉到了想要的资料文件都零零碎碎的。东一块西一块。很是不方便,今天就来整理一下关于node是如何操作使用mongoDB的,外加一些相关的配置详情介绍。话不多说,开整!
基础:node安装 + mongodb安装
如果已经装过的同学就不用看啦,直接跳过~
1. node安装步骤 (简单带过)
node中文网地址:Node.js中文网;
下载就要看各位同学的需求了,没什么特殊设定的同学,就直接按照自己的系统,安装对应的最新版本就好了。我使用的是windows系统,装的是64位。
但是呢,难免会有一些特殊的要求,比方我上家公司的前端框架啊,就要求使用8.x.x版本的node。当然其实都差不多,如果需要安装特定的版本也不难了,直接去官网下找到news的tab,找到你要的版本就好了~
node官网地址:Node.js官网;
建议下载安装包,一直下一步就ok~
安装好之后,按住 win + R ;输入 cmd 回车,输入 node -v 回车;npm -v 回车。如果显示对应的版本号,就说明你已经装好拉~
装完node都是附带装好了npm;对于npm相信大家都不陌生了,简言之就是:包管理工具! 通过这个工具,可以安装任何你需要使用的包。是不是很便捷~
这里需要说一下就是,npm去安装的时候,因为 “墙” 的缘故,我们访问npm第三方包通常都很慢。这个时候小伙伴们也不用担心,使用淘宝镜像就可以了。
使用淘宝镜像的方法(两种):
第一种 通过命令配置 修改npm同步包的地址:
code
命令:npm config set registry https://registry.npm.taobao.org
验证:npm config get registry
使用方法: npm install xxx
第二种 使用cnpm安装:
code
安装cnpm:npm install -g cnpm --registry=https://registry.npm.taobao.org
使用方法: cnpm install xxx
2. mongo安装步骤
mongo官网地址:MongoDB Community Download | MongoDB;
Mongo安装比较简单了:按照官网的选项,选择需要的版本,系统,安装包,就可以下载了。也是一样,一直下一步,路径的话,按照自己存放文件的习惯,自定义就好了。(建议文件名都使用英文命名,可以的话,就保持这个习惯。方便后面配置环境变量~)
安装好之后,去安装的bin目录下,执行一下命令,我这边是安装在d盘。
按住 win + R ;输入 cmd 回车,进入bin目录,执行命令👇 回车
code
mongod --dbpath D:\mangoDB\data\db
打开浏览器输入:localhost:27017/ 如果可以正常打开,说明你的Mongo已经安装成功,并且可以正常使用了~
启动mongo的两种方法:
第一种 到bin目录下启动服务
也就是上面提到的。但是这样的方法就需要在每次服务关机之后,再重启的话,都要到bin目录下执行。比较鸡肋~
第二种 部署环境,开机自启动
这样做就会一劳永逸,会随着你部署的机器开机自启,关机自停。往下看。
开始构建数据库服务运行文件:
首先是在mongodb目录下新建data\db和data\log两个子目录。接着mongoDB的目录下新建配置文件mongod.cfg,并将刚刚创建的两个子目录配置进去。
以下是配置项:(根据自己创建的目录,修改一下便可)
code
systemLog:
destination: file
path: D:\mangoDB\data\logs\mongo.log
storage:
dbPath: D:\mangoDB\data\db
一切准备妥当之后,cmd进入到bin目录
执行一下命令:
code
mongod --config "E:\mongodb\mongod.cfg" --install
执行完以上操作之后,基本配置与安装就完成了。
接下来就是启动服务了:(依然是在bin目录下~)
code
net start MongoDB
如果要停止服务也很简单,输入以下命令便可。
code
net stop MongoDB
正文:
好了,一切都准备就绪了,好戏开始啦~
首先你需要新建一个文件夹,然后到这个文件路径下。执行 npm init ,创建一个 package.json 文件,接着 npm install mongodb 开始装包。如果你使用的上面第一种修改同步包的方式,那就 npm install mongodb; 不然就 cnpm install mongodb ,我这边用的修改同步包的方式所以是 npm install mongodb。
code
npm init
npm install mongodb
接着创建一个testDB.js文件,开始体验~
1. 首先要在 MongoDB 中创建一个数据库,我们需要创建一个 MongoClient 对象,然后配置好指定的 URL 和 端口号。
创建连接
code
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/runoob";
MongoClient.connect(url,{ useNewUrlParser: true, useUnifiedTopology: true }, function(err, db) {
if (err) throw err;
console.log("数据库已创建!");
db.close();
});
保存,在文件目录下执行
code
node testDB.js
数据库已创建!
会发现 runoob 数据库已经创建好了。
2. 接下来就是创建集合。集合需要使用 createCollection() 方法来创建
code
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/runoob";
MongoClient.connect(url,{ useNewUrlParser: true, useUnifiedTopology: true }, function(err, db) {
if (err) throw err;
console.log("数据库已创建!");
var dbase = db.db("runoob");
dbase.createCollection('site', function (err, res) {
if (err) throw err;
console.log("创建集合!");
db.close();
});
});
保存,在文件目录下执行
code
node testDB.js
数据库已创建!
创建集合!
这个时候我们就已经创建好了数据库与集合了。(关于mango的基本概念,大家可以看一下相关文档 MongoDB 概念解析)
3. 插入数据 单条 & 多条
单条:
code
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("runoob");
var myobj = { name: "菜鸟教程", url: "www.runoob" };
dbo.collection("site").insertOne(myobj, function(err, res) {
if (err) throw err;
console.log("文档插入成功");
db.close();
});
});
保存,在文件目录下执行
code
node testDB.js
文档插入成功
多条:
code
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("runoob");
var myobj = [
{ name: '菜鸟工具', url: 'https://c.runoob.com', type: 'cn'},
{ name: 'Google', url: 'https://www.google.com', type: 'en'},
{ name: 'Facebook', url: 'https://www.google.com', type: 'en'}
];
dbo.collection("site").insertMany(myobj, function(err, res) {
if (err) throw err;
console.log("插入的文档数量为: " + res.insertedCount);
db.close();
});
});
保存,在文件目录下执行
code
node testDB.js
4. 查询数据 & 查询指定条件的数据
查询数据:
code
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url,{ useNewUrlParser: true, useUnifiedTopology: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("runoob");
dbo.collection("site"). find({}).toArray(function(err, result) { // 返回集合中所有数据
if (err) throw err;
console.log(result);
db.close();
});
});
保存,在文件目录下执行
code
node testDB.js
查询指定条件的数据:
code
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("runoob");
var whereStr = {"name":'菜鸟教程'}; // 查询条件
dbo.collection("site").find(whereStr).toArray(function(err, result) {
if (err) throw err;
console.log(result);
db.close();
});
});
保存,在文件目录下执行
code
node testDB.js
执行以下命令输出就结果为:
[ { _id: 5a794e36763eb821b24db854,
name: '菜鸟教程',
url: 'www.runoob' } ]
5. 更新数据 & 更新多条数据
更新数据:
code
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("runoob");
var whereStr = {"name":'菜鸟教程'}; // 查询条件
var updateStr = {$set: { "url" : "https://www.runoob.com" }};
dbo.collection("site").updateOne(whereStr, updateStr, function(err, res) {
if (err) throw err;
console.log("文档更新成功");
db.close();
});
});
保存,在文件目录下执行
code
node testDB.js
更新多条数据: 要更新所有符合条的文档数据可以使用 updateMany():
code
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url,{ useNewUrlParser: true, useUnifiedTopology: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("runoob");
var whereStr = {"type":'en'}; // 查询条件
var updateStr = {$set: { "url" : "https://www.runoob.com" }};
dbo.collection("site").updateMany(whereStr, updateStr, function(err, res) {
if (err) throw err;
console.log(res.result.nModified + " 条文档被更新");
db.close();
});
});
保存,在文件目录下执行
code
node testDB.js
执行以下命令输出就结果为:
{
"_id" : ObjectId("5a794e36763eb821b24db854"),
"name" : "菜鸟教程",
"url" : "https://www.runoob.com" // 已修改为 https
}
6. 删除数据 & 删除多条数据
删除数据:
code
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("runoob");
var whereStr = {"name":'菜鸟教程'}; // 查询条件
dbo.collection("site").deleteOne(whereStr, function(err, obj) {
if (err) throw err;
console.log("文档删除成功");
db.close();
});
});
保存,在文件目录下执行
code
node testDB.js
删除多条数据:删除多条语句可以使用 deleteMany() 方法
code
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url,{ useNewUrlParser: true, useUnifiedTopology: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("runoob");
var whereStr = { type: "en" }; // 查询条件
dbo.collection("site").deleteMany(whereStr, function(err, obj) {
if (err) throw err;
console.log(obj.result.n + " 条文档被删除");
db.close();
});
});
保存,在文件目录下执行
code
node testDB.js
1 条文档被删除
7. 排序 & 查询分页
排序:排序 使用 sort() 方法,该方法接受一个参数,规定是升序(1)还是降序(-1)。
code
{ type: 1 } // 按 type 字段升序
{ type: -1 } // 按 type 字段降序
code
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url,{ useNewUrlParser: true, useUnifiedTopology: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("runoob");
var mysort = { type: 1 };
dbo.collection("site").find().sort(mysort).toArray(function(err, result) {
if (err) throw err;
console.log(result);
db.close();
});
});
保存,在文件目录下执行
code
node testDB.js
查询分页:设置指定的返回条数可以使用 limit() 方法,该方法只接受一个参数,指定了返回的条数。
code
limit():读取两条数据
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url,{ useNewUrlParser: true, useUnifiedTopology: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("runoob");
dbo.collection("site").find().limit(2).toArray(function(err, result) {
if (err) throw err;
console.log(result);
db.close();
});
});
保存,在文件目录下执行
code
node testDB.js
如果要指定跳过的条数,可以使用 skip() 方法.
code
limit():读取两条数据 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("runoob");
dbo.collection("site").find().skip(2).limit(2).toArray(function(err, result) {
if (err) throw err;
console.log(result);
db.close();
});
});
保存,在文件目录下执行
code
node testDB.js
8. 删除集合
使用 drop() 方法来删除集合.
code
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("runoob");
// 删除 test 集合
dbo.collection("test").drop(function(err, delOK) { // 执行成功 delOK 返回 true,否则返回 false
if (err) throw err;
if (delOK) console.log("集合已删除");
db.close();
});
});
保存,在文件目录下执行
code
node testDB.js
9. 使用 Promise
Promise 是一个 ECMAScript 6 提供的类,目的是更加优雅地书写复杂的异步任务。
如果你还不了解 Promise,可以看看阮一峰老师的 Promise 对象 讲的超级好。
现在我们在一个程序中实现四个连续操作:增加 、查询 、更改 、删除。
code
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://localhost/";
MongoClient.connect(url).then((conn) => {
console.log("数据库已连接");
const test = conn.db("testdb").collection("test");
// 增加
test.insertOne({ "site": "runoob.com" }).then((res) => {
// 查询
return test.find().toArray().then((arr) => {
console.log(arr);
});
}).then(() => {
// 更改
return test.updateMany({ "site": "runoob.com" },
{ $set: { "site": "example.com" } });
}).then((res) => {
// 查询
return test.find().toArray().then((arr) => {
console.log(arr);
});
}).then(() => {
// 删除
return test.deleteMany({ "site": "example.com" });
}).then((res) => {
// 查询
return test.find().toArray().then((arr) => {
console.log(arr);
});
}).catch((err) => {
console.log("数据操作失败" + err.message);
}).finally(() => {
conn.close();
});
}).catch((err) => {
console.log("数据库连接失败");
});
保存,在文件目录下执行
code
node testDB.js
数据库已连接
[ { _id: 5f1664966833e531d83d3ac6, site: 'runoob.com' } ]
[ { _id: 5f1664966833e531d83d3ac6, site: 'example.com' } ]
[]
用异步函数实现相同的数据操作
code
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://localhost/";
async function dataOperate() {
var conn = null;
try {
conn = await MongoClient.connect(url);
console.log("数据库已连接");
const test = conn.db("testdb").collection("test");
// 增加
await test.insertOne({ "site": "runoob.com" });
// 查询
var arr = await test.find().toArray();
console.log(arr);
// 更改
await test.updateMany({ "site": "runoob.com" },
{ $set: { "site": "example.com" } });
// 查询
arr = await test.find().toArray();
console.log(arr);
// 删除
await test.deleteMany({ "site": "example.com" });
// 查询
arr = await test.find().toArray();
console.log(arr);
} catch (err) {
console.log("错误:" + err.message);
} finally {
if (conn != null) conn.close();
}
}
dataOperate();
保存,在文件目录下执行
code
node testDB.js
数据库已连接
[ { _id: 5f1664966833e531d83d3ac6, site: 'runoob.com' } ]
[ { _id: 5f1664966833e531d83d3ac6, site: 'example.com' } ]
[]
总结:
好嘞,差不多全都理完了,这边在讲下额外的使用吧。
1.首先第一个在查询的时候,多条件查询,会使用到 and 或者 or。这两个具体是怎么用呢?
首先是 and
code
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017';
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function (err, db) {
if (err) throw err;
var dbo = db.db("performdb");
var obj = { "platformname": "xxx.js" };
var timestart = { "Date": { "$gt": "2020-09-25 0:0:0" } };
var timeend = { "Date": { "$lt": "2020-09-30 16:36:28" } }
var whereStr = {
$and: [obj, timestart, timeend]
};
console.log('whereStr: ', whereStr)
dbo.collection("platformdata").find(whereStr).toArray(function (err, result) {
if (err) throw err;
console.log(result);
console.log(result.length);
db.close();
});
});
接着是 or
code
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017';
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function (err, db) {
if (err) throw err;
var dbo = db.db("domDiffdb");
var mysort = { date: -1 };
var whereStr = { $or: [{ "runcoderesult": "SUCESS" }, { "runcoderesult": "Fail" }] }; // 查询条件
dbo.collection('autoallpages').find(whereStr).sort(mysort).toArray(function (err, result) {
if (err) {
return err;
} else {
const len = result.length
if (len > 0) {
db.close();
res(result) // 返回的对象是个 Array
console.log('End done')
} else {
res('no data')
}
}
});
});
最后是 and 与 or 一起的复杂使用
code
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017';
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function (err, db) {
if (err) throw err;
var dbo = db.db("domDiffdb");
var mysort = { date: -1 };
var whereStr = { $or: [{ $and: [{ "runcoderesult": "SUCESS" }, whereobj] }, { $and: [{ "runcoderesult": "Fail" }, whereobj] }] }; // 查询条件
dbo.collection('autoallpages').find(whereStr).toArray(function (err, result) {
if (err) {
return err;
} else {
const len = result.length
if (len > 0) {
db.close();
res(result) // 返回的对象是个 Array
console.log('End done')
} else {
res('no data')
}
}
});
});
2.在数据库链接的过程中需要加入参数:{ useNewUrlParser: true, useUnifiedTopology: true } ,为什么呢?如果没有这个参数的话,在连接的时候会报一个 数据库启动警告 的错。
code
DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
好了以上就是本次分享的全部内容拉~ 码字不易,看到这就点个赞吧~