MongoDB 4.0 的启动 关闭和在Node中的使用
之前的3.6 一直搞不好window Service 这块,4.0安装的时候直接就把服务这块给你做了,方便了很多。把3.6卸了装了4.0.
安装成功后,启动 MongoDB:
"C:\Program Files\MongoDB\Server\4.0\bin\mongod.exe" --dbpath="I:\data\db"
--dbpath
指向的是你的数据库目录,必须先创建,MongoDB 不会帮你自动创建。
如何直观地看到 MongoDB 中的数据
一开始觉得 MongoDB 很难搞的原因是,似乎没看到有教程提到 MongoDB 有 Mysql 的 navicat 一样的可视化应用,这样如果知道自己对数据库的操作有没有实现呢。后来简书的一篇博客上看到了一个叫 robomongo 的跨系统可视化应用,推荐下载。
Node 连接数据库
数据库启动后:
首先 新建一个文件夹,在当前文件夹打开命令行工具(最方便的是使用 vscode 自带的命令行),初始化 package.json:
npm init -y
然后安装 mongodb:
npm i mongodb
新建一个文件叫demo_create_mongo_db.js
,下面的所有操作都可以在这个文件进行。
连接数据库:
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mydb";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
console.log("Database created!");
db.close();
});
如果是用命令行工具,则在命令行工具输入:
node demo_create_mongo_db.js
可看到运行结果,用 vscode 的只需要按 F5 就会在终端自动运行。
如果成功连接,控制台会打印 "Database created!"。
创建 Collection
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("mydb");
dbo.createCollection("customers", function(err, res) {
if (err) throw err;
console.log("Collection created!");
db.close();
});
});
如果创建成功,控制台会打印 "Collection created!"。
- 在 Mysql 中的 Table 对应的就是 MongoDB 的 Collection。record 在 MongoDB 中则被称为 document.
插入
插入一个 document,使用的 API 是 insertOne()
。
insertOne
的第一个参数是一个你想插入 document 中的 JSON 对象。第二个参数是方法的回调。
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("mydb");
var myobj = { name: "Company Inc", address: "Highway 37" };
dbo.collection("customers").insertOne(myobj, function(err, res) {
if (err) throw err;
console.log("1 document inserted");
db.close();
});
});
如果创建成功,控制台会打印 "Collection created!"。在 robomongo 中也可以看到:
一份 document 中的数据是用 键值对 的形式保存的。 一个document 就是一个对象 ,每个 document 有一个特定的
_id
。这个 _id
可以自定义,但是必须保证 _id
在一个 Collection 中是独一无二的。
插入多个 documents
当要一次性插入多个 documents 时,就要用到 API insertMany()
,多个对象用数据包裹起来:
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("mydb");
var myobj = [
{ name: 'John', address: 'Highway 71'},
{ name: 'Peter', address: 'Lowstreet 4'},
{ name: 'Amy', address: 'Apple st 652'},
{ name: 'Hannah', address: 'Mountain 21'},
{ name: 'Michael', address: 'Valley 345'},
{ name: 'Sandy', address: 'Ocean blvd 2'},
{ name: 'Betty', address: 'Green Grass 1'},
{ name: 'Richard', address: 'Sky st 331'},
{ name: 'Susan', address: 'One way 98'},
{ name: 'Vicky', address: 'Yellow Garden 2'},
{ name: 'Ben', address: 'Park Lane 38'},
{ name: 'William', address: 'Central st 954'},
{ name: 'Chuck', address: 'Main Road 989'},
{ name: 'Viola', address: 'Sideway 1633'}
];
dbo.collection("customers").insertMany(myobj, function(err, res) {
if (err) throw err;
console.log("Number of documents inserted: " + res.insertedCount);
db.close();
});
});
插入多个 documents 返回的结果对象
插入多个 documents 返回的结果对象包含的信息反应了 插入如何影响数据库,上面的例子中插入后返回的结果对象如下:
{
result: { ok: 1, n: 14 },
ops: [
{ name: 'John', address: 'Highway 71', _id: 58fdbf5c0ef8a50b4cdd9a84 },
{ name: 'Peter', address: 'Lowstreet 4', _id: 58fdbf5c0ef8a50b4cdd9a85 },
{ name: 'Amy', address: 'Apple st 652', _id: 58fdbf5c0ef8a50b4cdd9a86 },
{ name: 'Hannah', address: 'Mountain 21', _id: 58fdbf5c0ef8a50b4cdd9a87 },
{ name: 'Michael', address: 'Valley 345', _id: 58fdbf5c0ef8a50b4cdd9a88 },
{ name: 'Sandy', address: 'Ocean blvd 2', _id: 58fdbf5c0ef8a50b4cdd9a89 },
{ name: 'Betty', address: 'Green Grass 1', _id: 58fdbf5c0ef8a50b4cdd9a8a },
{ name: 'Richard', address: 'Sky st 331', _id: 58fdbf5c0ef8a50b4cdd9a8b },
{ name: 'Susan', address: 'One way 98', _id: 58fdbf5c0ef8a50b4cdd9a8c },
{ name: 'Vicky', address: 'Yellow Garden 2', _id: 58fdbf5c0ef8a50b4cdd9a8d },
{ name: 'Ben', address: 'Park Lane 38', _id: 58fdbf5c0ef8a50b4cdd9a8e },
{ name: 'William', address: 'Central st 954', _id: 58fdbf5c0ef8a50b4cdd9a8f },
{ name: 'Chuck', address: 'Main Road 989', _id: 58fdbf5c0ef8a50b4cdd9a90 },
{ name: 'Viola', address: 'Sideway 1633', _id: 58fdbf5c0ef8a50b4cdd9a91 } ],
insertedCount: 14,
insertedIds: [
58fdbf5c0ef8a50b4cdd9a84,
58fdbf5c0ef8a50b4cdd9a85,
58fdbf5c0ef8a50b4cdd9a86,
58fdbf5c0ef8a50b4cdd9a87,
58fdbf5c0ef8a50b4cdd9a88,
58fdbf5c0ef8a50b4cdd9a89,
58fdbf5c0ef8a50b4cdd9a8a,
58fdbf5c0ef8a50b4cdd9a8b,
58fdbf5c0ef8a50b4cdd9a8c,
58fdbf5c0ef8a50b4cdd9a8d,
58fdbf5c0ef8a50b4cdd9a8e,
58fdbf5c0ef8a50b4cdd9a8f
58fdbf5c0ef8a50b4cdd9a90,
58fdbf5c0ef8a50b4cdd9a91 ]
}
查找
查找一项
插入使用 API findOne()
:
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("mydb");
dbo.collection("customers").findOne({}, function(err, result) {
if (err) throw err;
console.log(result.name);
db.close();
});
});
查找全部项
查找多项可不是 findMany()
!而是使用 find()
用法稍有不同,有点像链式调用:
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("mydb");
dbo.collection("customers").find({}).toArray(function(err, result) {
if (err) throw err;
console.log(result);
db.close();
});
});
查找某些项
find()
方法的第二个参数是一个 projection
对象,描述哪个范围中的数据要出现在结果中:
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("mydb");
dbo.collection("customers").find({}, { projection: { _id: 0, name: 1, address: 1 } }).toArray(function(err, result) {
if (err) throw err;
console.log(result);
db.close();
});
});
这样会打印出全部数据,0 和 1 表示的应该是 排除
和 选中
,{ _id: 0, name: 1, address: 1 }
指的是查找结果中,只显示属性 name
和 address
,不显示 _id
,运行结果如下:
不能同时出现 0 和 1 在同一个对象中,(除非这个属性是
_id
),一旦在projection
中指定了某一个属性是 0,则代表除了这个属性不出现在结果中,其他属性都显示,如果指定一个属性是1,则代表只有这个属性出现在结果中。同时指定 0 和 1 会导致报错:MongoError: Projection cannot have a mix of inclusion and exclusion.
查询(query)
给find()
传入第一个参数,是一个对象,用于筛选查找结果:
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("mydb");
var query = { address: "Park Lane 38" };
dbo.collection("customers").find(query).toArray(function(err, result) {
if (err) throw err;
console.log(result);
db.close();
});
});
关闭 MongoDB
在命令行中
use admin
db.shutdownServer()
参考文章:
Node.js MongoDB Create Collection
MongoDB安装/配置/启动/命令 - 简书