MongoDB是种NoSQL概念数据库(Not only sql)数据库。
MongoDB是基于分布式文件存储的数据库。
简单一句话概括:很强大!性能比MySQL强大、功能更简单、更易用。做大型项目,有很多数据存储的话用它就对了!
![92a478f3bc1f1a8cb1093247f3cc1e32.png](https://i-blog.csdnimg.cn/blog_migrate/c3c24338d374a523d7b01881f23da2da.jpeg)
1、安装
MongoDB是分布式的,建议使用时独立安装在一台服务器、与功能程序分离。
那么,本文示例,一台运行Node程序,另一台装MongoDB。
Win系统下载安装。
下载时选择系统和版本:
![74a7dcd4b630d72f3d474f4f80f13f1a.png](https://i-blog.csdnimg.cn/blog_migrate/555f90672c1efc5f607097ed299aa270.jpeg)
然后是一路Next安装:
![f591f02eae53fecdeb85cc1a39d247c0.png](https://i-blog.csdnimg.cn/blog_migrate/211ff11d37875e45ec3d1d48765c231d.jpeg)
![c7ea06a507f70796bebc7fdd2f6b2a98.png](https://i-blog.csdnimg.cn/blog_migrate/71ddcf37ce97b4ce89545212822b7ce9.jpeg)
4.2.2版本,安装后直接就可以用了,不像旧版需要配置数据库和日志地址、还需要手动启动服务。
2、使用
在另一台机器,开始编写例程。
首先安装Node的MongoDB客户端模块:
npm i mongodb
代码1、连接数据:
var MongoClient = require('mongodb').MongoClient;var url = "mongodb://192.168.31.18:27017/jshaman"; MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) { if (err) { console.log(err.message); }else{ console.log("Database ready!"); db.close(); } });
本例中,192.168.31.18是另一台MongoDB的地址。
执行:
![e16abdd4fc39eea33c1ec6a442b302c8.png](https://i-blog.csdnimg.cn/blog_migrate/170018d0e764734028bf8049bf2828b4.jpeg)
未连接成功,超时了。
有两种原因:另一台机器上的防火墙阻止了连接,或MongoDB的默认配置不允许远程连接。
回到MongoDB安装机器,做如下修改:
关闭防火墙:
![e7dad35744b0605e90406b5ae74e4bc3.png](https://i-blog.csdnimg.cn/blog_migrate/4c3ca0cfff73a40b13e641654c5cde6d.jpeg)
修改MongoDB配置文件:
![c7451d78ff473b407aa899358b3d1591.png](https://i-blog.csdnimg.cn/blog_migrate/e8f1dc8d233c3e41ca5cc10d7c258645.jpeg)
并重启MongoDB服务(不重启的话修改配置不会生效):
![e8de723e3d3a0a4a55d2611a18e2d2cd.png](https://i-blog.csdnimg.cn/blog_migrate/a9d95b543654829a189b7b64325a1a13.jpeg)
再次执行刚才的代码:
![71bcc47ea3734a91e8572169b92b99d8.png](https://i-blog.csdnimg.cn/blog_migrate/46792310a7ce184a4b99a73c1e4c41e7.jpeg)
连接、创建数据库已成功。
接下来进行数据库操作。
插入数据:
var MongoClient = require('mongodb').MongoClient;var url = "mongodb://192.168.31.18:27017/"; MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) { if (err) { console.log(err.message); }else{ var dbo = db.db("jshaman"); var myobj = { name: "web", url: "www.jshaman.com" }; dbo.collection("mywebs").insertOne(myobj, function(err, res) { if (err) throw err; console.log("insert success."); db.close(); }); } });
![b4cf1d328440f6384ba7ef29218f8ea0.png](https://i-blog.csdnimg.cn/blog_migrate/b56c5ce442a42e48626de51b59c2b082.jpeg)
执行,插入数据成功:
![fc32976f205d15dc0a43c03a664ca3b6.png](https://i-blog.csdnimg.cn/blog_migrate/8d74dd88c6c214c80c16f3117b6e333e.jpeg)
到MongoDB机器,用Mongo命令查看一下刚才插入的数据:
![498ed53818f7c0b11ac96e4d08520ca4.png](https://i-blog.csdnimg.cn/blog_migrate/1ec5cd9f6cd4b638f40404a55ae78826.jpeg)
show dbs:查看所有的数据库;use jshaman:切换到jshaman库;show tables:查看所有的表;db.mywebs.find():查询所有数据。
上面是插入一条数据,也可以一次插入多条数据:
var MongoClient = require('mongodb').MongoClient;var url = "mongodb://192.168.31.18:27017/"; MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) { if (err) { console.log(err.message); }else{ var dbo = db.db("jshaman"); var myobj = [ { name: 'web1', url: 'http://www.jshaman.com', type: 'cn'}, { name: 'web2', url: 'http://www.sharewaf.com', type: 'en'}, { name: 'web3', url: 'https://www.ty2y.com', type: 'en'} ]; dbo.collection("site").insertMany(myobj, function(err, res) { if (err) throw err; console.log("insert numbers: " + res.insertedCount); db.close(); }); } });
res.insertedCount 为插入的条数。
执行:
![135abe2c849ff756f536819b0cdf59c1.png](https://i-blog.csdnimg.cn/blog_migrate/aa9ffe777aede31f9ee5baee2369f521.jpeg)
查询数据:
可以使用 find() 来查找数据, find() 可以返回匹配条件的所有数据。 如果未指定条件,find() 返回集合中的所有数据。
var MongoClient = require('mongodb').MongoClient;var url = "mongodb://192.168.31.18:27017/"; MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) { if (err) { console.log(err.message); }else{ var dbo = db.db("jshaman"); dbo.collection("site"). find({}).toArray(function(err, result) { if (err) throw err; console.log(result); db.close(); }); } });
执行:
![0230b52814ca2efa838f7b0d5899a596.png](https://i-blog.csdnimg.cn/blog_migrate/3a1c1d8f30feae5f7d20022250051c1e.jpeg)
修改代码,加入查询条件:
var MongoClient = require('mongodb').MongoClient;var url = "mongodb://192.168.31.18:27017/"; MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) { if (err) { console.log(err.message); }else{ var dbo = db.db("jshaman"); // 查询条件 var whereStr = {"name":'web1'}; dbo.collection("site").find(whereStr).toArray(function(err, result) { if (err) throw err; console.log(result); db.close(); }); } });
执行:
![4d9bf77bcd4c6c5e68ca52a002761090.png](https://i-blog.csdnimg.cn/blog_migrate/1424ce19ab87992538461c0d560226ed.jpeg)
更新数据:
var MongoClient = require('mongodb').MongoClient;var url = "mongodb://192.168.31.18:27017/"; MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) { if (err) { console.log(err.message); }else{ var dbo = db.db("jshaman"); // 查询条件 var whereStr = {"name":'web1'}; var updateStr = {$set: { "url" : "http://www.fairysoftware.com" }}; // 将名为web1的url改为http://www.fairysoftware.com dbo.collection("site").updateOne(whereStr, updateStr, function(err, res) { if (err) throw err; console.log("Update success."); db.close(); }); } });
但这个方法只会更新一条数据:
![bdf6b9a275eeb27742730783a8297828.png](https://i-blog.csdnimg.cn/blog_migrate/8d242eb607e0203304670fad957f3d4c.jpeg)
如要更新多条或所有:
var MongoClient = require('mongodb').MongoClient;var url = "mongodb://192.168.31.18:27017/"; MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) { if (err) { console.log(err.message); }else{ var dbo = db.db("jshaman"); // 查询条件 var whereStr = {"name":'web1'}; var updateStr = {$set: { "url" : "http://www.sharewaf.com" }}; dbo.collection("site").updateMany(whereStr, updateStr, function(err, res) { if (err) throw err; console.log(res.result.nModified + " updated!"); db.close(); }); } });
执行显示:
![2bc981ada299291f9e69036aeebdba5c.png](https://i-blog.csdnimg.cn/blog_migrate/bab8cf2d1a484c1c21bcba5000846c9a.jpeg)
确认:
![fc975add092309004b70550a30166715.png](https://i-blog.csdnimg.cn/blog_migrate/9e16b87581081697c18edafaa8b7d206.jpeg)
删除数据:
删除某一条数据:
var MongoClient = require('mongodb').MongoClient;var url = "mongodb://192.168.31.18:27017/"; MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) { if (err) { console.log(err.message); }else{ var dbo = db.db("jshaman"); // 查询条件 var whereStr = {"name":'web1'}; dbo.collection("site").deleteOne(whereStr, function(err, obj) { if (err) throw err; console.log("delete success"); db.close(); }); } });
删除多条数据:
var MongoClient = require('mongodb').MongoClient;var url = "mongodb://192.168.31.18:27017/"; MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) { if (err) { console.log(err.message); }else{ var dbo = db.db("jshaman"); // 查询条件 var whereStr = {"name":'web1'}; dbo.collection("site").deleteMany(whereStr, function(err, obj) { if (err) throw err; console.log(obj.result.n + " delete success!"); db.close(); }); } });
执行:
![a2cb720fa704f942cb47bbc9d11f32ed.png](https://i-blog.csdnimg.cn/blog_migrate/0392d9cd6f7bc19cca5a1a6437a96210.jpeg)
更多功能:
排序:
使用 sort() 方法,该方法接受一个参数,规定是升序(1)还是降序(-1)。
代码片段:
dbo.collection("site").find().sort(mysort).toArray(function(err, result) { if (err) throw err; console.log(result); db.close();});
分页查询:
limit():读取两条数据:
dbo.collection("site").find().limit(2).toArray(function(err, result) { if (err) throw err; console.log(result); db.close(); });
skip(): 跳过前面两条数据,读取两条数据:
dbo.collection("site").find().skip(2).limit(2).toArray(function(err, result) { if (err) throw err; console.log(result); db.close(); });
MongoDB的常用操作基本就是这些了,感觉怎么样,是不是强大、简单又好用呢?
更多本系列文章:
Node.JS实战46:断言,调试和测试必备
Node.JS实战45:获取磁盘空间信息
Node.JS实战44:非常好用的数据库:SQLite
Node.JS实战43:Prune,给项目瘦个身
Node.JS实战42:又一高端操作:API HOOK