MongoDB 4.0 的启动 关闭和在Node中的使用

2018-12-19  本文已影响0人  般犀

之前的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!"。

插入

插入一个 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 中也可以看到:

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 }指的是查找结果中,只显示属性 nameaddress ,不显示 _id,运行结果如下:

_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安装/配置/启动/命令 - 简书

上一篇 下一篇

猜你喜欢

热点阅读