var MongoClient = require'mongodb'.MongoClient; // kết nối đến csdl MongoClient.connect"mongodb://localhost:27017/MyDb", function err, db { iferr throw err; // viết code thêm, xóa, sửa t
Trang 1Node.js MongoDB
Node.js có thể được sử dụng trong các ứng dụng cơ sở dữ liệu
Một trong những cơ sở dữ liệu NoSQL phổ biến nhất là MongoDB
Cài đặt Driver MongoDB
Cần cài đặt trình điều khiển MongoDB tại
https://www.npmjs.com/package/mongodb
Hoặc dùng Command Terminal và thực hiện như sau:
Tải xuống và cài đặt gói mongodb:
C:\Users\Your Name>npm install mongodb
Bây giờ ta có thể sử dụng mô-đun này để thao tác cơ sở dữ liệuMongoDB: var mongo = require('mongodb');
Trang 2Bây giờ, khởi động máy chủ MongoDB bằng cách sử dụng lệnh sau đây (Giả sử rằng cơ sở dữ liệu MongoDB nằm ở thư mục C:\MyNodeJSConsoleApp\MyMongoDB.)
mongod -dbpath C:\MyNodeJSConsoleApp\MyMongoDB
Kết nối đến csdl MongoDB trên máy cục bộ.
var MongoClient = require('mongodb').MongoClient;
// kết nối đến csdl
MongoClient.connect("mongodb://localhost:27017/MyDb",
function (err, db) {
if(err) throw err;
// viết code thêm, xóa, sửa tại đây…
}
); Trong ví dụ trên, ta import mô đun mongodb (các trình điều khiển gốc) và nhận tham chiếu của đối tượng MongoClient Sau đó sử dụng phương thức
MongoClient.connect () để lấy tham chiếu đến cơ sở dữ liệu MongoDB đã chỉ định URL được chỉ định "mongodb://localhost:27017/MyDb" trỏ đến
cơ sở dữ liệu MongoDB cục bộ được tạo trong thư mục MyMongoDB Phương thức connect () trả về tham chiếu cơ sở dữ liệu nếu
cơ sở dữ liệu được chỉ định đã tồn tại, nếu không nó sẽ tạo ra một cơ sở dữ liệu mới Bây giờ có thể chèn/cập nhật/truy vấn cơ sở dữ liệu MongoDB trong hàm callback của phương thức connect () bằng tham số db.
Trang 3Node.js MongoDB Create Database
Tạo cơ sở dữ liệu
Để tạo một cơ sở dữ liệu trong MongoDB, hãy bắt đầu bằng cách tạo một đối tượng MongoClient, sau đó chỉ định một URL kết nối có address IP chính xác và tên của cơ sở dữ liệu bạn muốn tạo.
MongoDB sẽ tạo cơ sở dữ liệu nếu nó không tồn tại và tạo một kết nối tới nó.
Thí dụ: Tạo một cơ sở dữ liệu được gọi là "mydb"
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mydb";
Trang 4Lưu mã ở trên trong một tệp có tên
"demo_create_mongo_db.js" và chạy tệp:
Chạy "demo_create_mongo_db.js"
C:\Users\Your Name>node demo_create_mongo_db.js
Mà sẽ cung cấp cho bạn kết quả này:
Database created!
Quan trọng: Trong MongoDB, một cơ sở dữ liệu không
được tạo cho đến khi nó nhận được nội dung!
MongoDB đợi cho đến khi bạn đã tạo một collection (bảng), với ít nhất một document (bản ghi) trước khi nó thực sự tạo
ra cơ sở dữ liệu (và collection).
Trang 5Node.js MongoDB Create Collection
Một collection trong MongoDB giống như một bảng trong MySQL
Tạo collection: Để tạo một collection trong MongoDB, sửdụng createCollection()phương thức:
Thí dụ
Tạo collection có tên là "khách hàng":
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();
});
});
Trang 6Lưu mã bên trên vào một tệp có tên
"demo_mongodb_createcollection.js" và chạy tệp:
Chạy "demo_mongodb_createcollection.js"
C:\Users\Your Name>node demo_mongodb_createcollection.js
Mà sẽ cung cấp cho bạn kết quả này:
Collection created!
Quan trọng: Trong MongoDB, một collection không được tạo cho
đến khi nó nhận được nội dung!
MongoDB đợi cho đến khi bạn đã chèn một document trước khi nóthực sự tạo ra collection
Trang 7Node.js MongoDB Insert
Để chèn một bản ghi, hoặc document như nó được gọi
trong MongoDB, vào một collection, ta sử dụng
insertOne() phương thức này.
Một document trong MongoDB giống như một bản
ghi trong MySQL
Tham số đầu tiên của insertOne() phương thức là một đối tượng có chứa (các) tên và (các) giá trị của mỗi trường trong document mà bạn muốn chèn vào.
Nó cũng có chức năng gọi lại nơi bạn có thể làm việc với bất kỳ lỗi nào hoặc kết quả của việc chèn:
Trang 8Thí dụ: Chèn document vào collection “customers"
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();
});
});
Ghi chú: Nếu cố gắng chèn document vào collection không
tồn tại, MongoDB sẽ tự động tạo collection.
Trang 9Ví dụ chèn các document vào csdl MongoDB.
var MongoClient = require('mongodb').MongoClient;
// Connect to the db
MongoClient.connect("mongodb://localhost:27017/MyDb",
function (err, db) {
db.collection('Persons', function (err, collection) {
collection.insert({ id: 1, firstName: 'Steve', lastName: 'Jobs' });
collection.insert({ id: 2, firstName: 'Bill', lastName: 'Gates' });
collection.insert({ id: 3, firstName: 'James', lastName: 'Bond’}); db.collection('Persons').count(function (err, count) {
if (err) throw err;
console.log('Total Rows: ' + count);
});
});
}); Trong ví dụ trên, phương thức db.collection () tạo hoặc nhận tham chiếu của collection được chỉ
định Collection tương tự như bảng trong cơ sở dữ liệu quan hệ Chúng ta đã tạo một collection tên là Persons trong ví dụ trên và chèn ba document (hàng) vào trong đó Sau đó, hiển thị tổng số document được lưu trữ trong collection.
> node app.js
Total Rows: 3
Trang 10Nó cũng có chức năng gọi lại nơi bạn có thể làm việc với bất
kỳ lỗi nào hoặc kết quả của việc chèn:
Trang 11var 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();
});
});
Thí dụ: Chèn nhiều document trong collection "khách
hàng":
Trang 12Đối tượng Result
Khi thực thi insertMany() , một đối tượng Result được trả về Nó chứa thông tin về các ảnh hưởng đến cơ sở dữ liệu Đối tượng Result được trả
về từ ví dụ trên trông như sau:
{ 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 } ],
Trang 13Các giá trị của các thuộc tính có thể được hiển thị như thế này:
Thí dụ: Trả về số lượng document được chèn
console.log(res.insertedCount)
Mà sẽ tạo ra kết quả này:
14
Trang 14Trường _id
Nếu bạn không chỉ định một _id trường, thì MongoDB sẽ thêm một trường cho bạn và gán một id duy nhất cho mỗi document.
Trong ví dụ trên không có _id trường nào được chỉ định,
và như bạn có thể thấy từ đối tượng kết quả, MongoDB gán một _id duy nhất cho mỗi document.
Nếu bạn làm rõ các _id lĩnh vực, giá trị phải là duy nhất cho mỗi document:
Thí dụ
Chèn ba bản ghi vào bảng "sản phẩm", với _id các trường được chỉ định :
Trang 15var 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 = [
{ _id: 154, name: 'Chocolate Heaven' },
{ _id: 155, name: 'Tasty Lemon' },
{ _id: 156, name: 'Vanilla Dream' }
Trang 16Lưu mã ở trên trong một tệp có tên "demo_mongodb_insert_id.js"
và chạy tệp:
Chạy "demo_mongodb_insert_id.js"
C:\Users\Your Name>node demo_mongodb_insert_id.js
Mà sẽ cung cấp cho bạn kết quả này:
{
result: { ok: 1, n: 3 },
ops: [
{ _id: 154, name: 'Chocolate Heaven },
{ _id: 155, name: 'Tasty Lemon },
{ _id: 156, name: 'Vanilla Dream }
Trang 17Node.js MongoDB Find
Trong MongoDB ta sử dụng các phương
thức find và findOne để tìm dữ liệu trong một collection.
Cũng giống như câu lệnh SELECT được sử dụng để tìm dữ
liệu trong một bảng trong cơ sở dữ liệu.
Trang 18Thí dụ: Tìm document đầu tiên trong collection khách hàng
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({},
if (err) throw err;
console.log(result.name);
db.close();
});
});
Trang 19Tìm tất cả
Để chọn dữ liệu từ một bảng trong MongoDB, ta dùng find() Phương thức này trả về tất cả những gì xuất hiện.
Tham số đầu tiên của find() là một đối tượng truy vấn Trong
ví dụ này, ta sử dụng một đối tượng truy vấn trống, nó sẽ chọn tất cả các document trong collection.
Không có tham số nào trong phương thức find () sẽ cho kết quả
tương tự như SELECT * trong SQL.
Thí dụ: Tìm tất cả document trong collection khách hàng:
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();
});
});
Trang 20Tìm một số thứ
Tham số thứ hai của find() là một đối tượng mô tả các field cầnđưa vào kết quả Tham số này là tùy chọn và nếu bỏ qua, tất cả cácfield sẽ được bao gồm trong kết quả Thí dụ: Trả lại field “name" và
“address" của tất cả các document trong collection khách hàng
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({}, { _id: 0 ,
name: 1 , address: 1 }).toArray(
if (err) throw err;
console.log(result);
db.close();
});
}); Không được phép chỉ định cả giá trị 0 và 1 trong cùng một đối tượng (ngoại trừ nếu một trong các trường là
trường _id) Nếu chỉ định một trường có giá trị 0, tất
cả các trường khác sẽ nhận giá trị 1 và ngược lại
Trang 21Ví dụ này sẽ loại trừ “address" khỏi kết quả
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({}, {
address: 0 }).toArray(
if (err) throw err;
Trang 22Ví dụ này sẽ chỉ trả về trường "name"
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({}, { _id: 0 ,
name: 1 }).toArray(
function (err, result) {
if (err) throw err;
{ name: 'John' }, { name: 'Peter' }, { name: 'Amy' }, { name: 'Hannah' }, { name: 'Michael' }, { name: 'Sandy' }, { name: 'Betty' }, { name: 'Richard' }, { name: 'Susan' }, { name: 'Vicky' }, { name: 'Ben' }, { name: 'William' }, { name: 'Chuck' }, { name: 'Viola' } ]
Trang 23Ví dụ sẽ cho kết quả tương tự như ví dụ đầu tiên; trả về tất
cả các trường ngoại trừ trường _id:
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({}, {_id: 0 })
toArray(function(err, result) {
if (err) throw err;
console.log(result);
db.close();
});
});
Trang 24Đối tượng Result
Như đã thấy từ kết quả của ví dụ trên, kết quả có thể được chuyển đổi thành một mảng chứa mỗi document như một đối tượng.
Để trả về ví dụ address của document thứ ba, chỉ cần tham chiếu đến thuộc tính address của đối tượng mảng thứ ba:
Trang 25Truy vấn cơ sở dữ liệu
Ví dụ sau đây thực hiện truy vấn cơ sở dữ liệu MongoDB.
var MongoClient = require( 'mongodb' ).MongoClient;
// Connect to the db
MongoClient.connect( "mongodb://localhost:27017/MyDb" , function (err, db) {
db.collection( 'Persons' , function (err, collection) {
collection.find().toArray( function (err, items) {
if (err) throw err;
console.log(items);
});
});
});
Trang 26Node.js MongoDB Query
Thí dụ: Tìm document có address "Park Lane 38":
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();
});
});
Trang 27Lưu mã ở trên trong một tệp có tên
}
]
Trang 28Lọc với biểu thức thông dụng
Ta có thể viết biểu thức chính quy để tìm chính xác những gì đangtìm kiếm
Các biểu thức chỉ có thể được sử dụng để truy vấn chuỗi
Để tìm các document mà trường “address" bắt đầu bằng chữ "S", tadùng cụm từ thông dụng /^S/:
Thí dụ: Tìm document có address bắt đầu bằng chữ "S":
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: /^S/ };
dbo.collection( "customers" ).find(query).toArray(
function (err, result) {
if (err) throw err;
console.log(result);
db.close();
});
});
Trang 29Lưu mã ở trên trong một tệp có tên
"demo_mongodb_query_s.js" và chạy tệp:
Chạy "demo_mongodb_query_s.js"
C:\Users\Your Name>node demo_mongodb_query_s.js
Mà sẽ cung cấp cho bạn kết quả này:
Trang 30Node.js MongoDB Sort
Sử dụng sort() để sắp xếp kết quả theo thứ tự tăng dần hoặc giảm dần Phương thức sort() có một tham số, một đối tượng xác định thứ tự sắp xếp Thí dụ: Sắp xếp tên theo thứ tự bảng chữ cái
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 mysort = { name: 1 };
dbo.collection("customers").find().sort(mysort).
toArray(function(err, result) {
if (err) throw err;
console.log(result);
db.close();
});
});