Mongoose là thư viện Mô hình hóa dữ liệu đối tượng [ODM] cho MongoDB và Node. js. Nó quản lý các mối quan hệ giữa dữ liệu, cung cấp xác thực lược đồ và được sử dụng để dịch giữa các đối tượng trong mã và biểu diễn của các đối tượng đó trong MongoDB
Ánh xạ đối tượng giữa Node và MongoDB được quản lý thông qua MongooseMongoDB là một cơ sở dữ liệu tài liệu NoSQL không có lược đồ. Điều đó có nghĩa là bạn có thể lưu trữ các tài liệu JSON trong đó và cấu trúc của các tài liệu này có thể thay đổi vì nó không được thực thi như cơ sở dữ liệu SQL. Đây là một trong những lợi thế của việc sử dụng NoSQL vì nó tăng tốc độ phát triển ứng dụng và giảm độ phức tạp của việc triển khai
Dưới đây là một ví dụ về cách dữ liệu được lưu trữ trong Mongo vs. Cơ sở dữ liệu SQL
Tài liệu NoSQL so với. Bảng quan hệ trong SQLthuật ngữ
bộ sưu tập
'Bộ sưu tập' trong Mongo tương đương với các bảng trong cơ sở dữ liệu quan hệ. Họ có thể chứa nhiều tài liệu JSON
Các tài liệu
'Tài liệu' tương đương với bản ghi hoặc hàng dữ liệu trong SQL. Mặc dù một hàng SQL có thể tham chiếu dữ liệu trong các bảng khác, nhưng các tài liệu Mongo thường kết hợp dữ liệu đó trong một tài liệu
Lĩnh vực
'Trường' hoặc thuộc tính tương tự như cột trong bảng SQL
Lược đồ
Mặc dù Mongo không có lược đồ, nhưng SQL định nghĩa một lược đồ thông qua định nghĩa bảng. 'Lược đồ' Mongoose là cấu trúc dữ liệu tài liệu [hoặc hình dạng của tài liệu] được thực thi thông qua lớp ứng dụng
người mẫu
'Mô hình' là các hàm tạo bậc cao lấy một lược đồ và tạo một thể hiện của tài liệu tương đương với các bản ghi trong cơ sở dữ liệu quan hệ
Bắt đầu
Cài đặt Mongo
Trước khi bắt đầu, hãy thiết lập Mongo. Bạn có thể chọn một trong các tùy chọn sau [chúng tôi đang sử dụng tùy chọn số 1 cho bài viết này]
- Tải xuống phiên bản MongoDB thích hợp cho Hệ điều hành của bạn từ và làm theo hướng dẫn cài đặt của chúng
- Tạo đăng ký cơ sở dữ liệu sandbox miễn phí trên mLab
- Cài đặt Mongo bằng Docker nếu bạn thích sử dụng docker hơn
Hãy cùng tìm hiểu một số kiến thức cơ bản về Mongoose bằng cách triển khai mô hình biểu thị dữ liệu cho sổ địa chỉ được đơn giản hóa
Tôi đang sử dụng Visual Studio Code, Nút 8. 9 và NPM 5. 6. Kích hoạt IDE yêu thích của bạn, tạo một dự án trống và bắt đầu. Chúng tôi sẽ sử dụng cú pháp ES6 giới hạn trong Node, vì vậy chúng tôi sẽ không định cấu hình Babel
Cài đặt NPM
Hãy vào thư mục dự án và khởi tạo dự án của chúng tôi
npm init -y
Hãy cài đặt Mongoose và thư viện xác thực bằng lệnh sau
npm install mongoose validator
Lệnh cài đặt ở trên sẽ cài đặt phiên bản mới nhất của các thư viện. Cú pháp Mongoose trong bài viết này dành riêng cho Mongoose v5 trở lên
kết nối cơ sở dữ liệu
Tạo một tệp
let mongoose = require['mongoose']
1 dưới thư mục gốc của dự ánTiếp theo, chúng ta sẽ thêm một lớp đơn giản với một phương thức kết nối với cơ sở dữ liệu
Chuỗi kết nối của bạn sẽ thay đổi dựa trên cài đặt của bạn
let mongoose = require['mongoose'];
const server = '127.0.0.1:27017'; // REPLACE WITH YOUR DB SERVER
const database = 'fcc-Mail'; // REPLACE WITH YOUR DB NAME
class Database {
constructor[] {
this._connect[]
}
_connect[] {
mongoose.connect[`mongodb://${server}/${database}`]
.then[[] => {
console.log['Database connection successful']
}]
.catch[err => {
console.error['Database connection error']
}]
}
}
module.exports = new Database[]
Cuộc gọi
let mongoose = require['mongoose']
2 ở trên trả về một đối tượng Singleton. Điều đó có nghĩa là lần đầu tiên bạn gọi let mongoose = require['mongoose']
2, nó đang tạo một thể hiện của lớp Mongoose và trả về nó. Trong các lần gọi tiếp theo, nó sẽ trả về cùng một phiên bản đã được tạo và trả lại cho bạn lần đầu tiên do cách nhập/xuất mô-đun hoạt động trong ES6Nhập mô-đun/yêu cầu luồng công việcTương tự, chúng ta đã biến lớp Cơ sở dữ liệu của mình thành một lớp đơn bằng cách trả về một thể hiện của lớp trong câu lệnh
let mongoose = require['mongoose']
4 vì chúng ta chỉ cần một kết nối duy nhất đến cơ sở dữ liệuES6 giúp chúng tôi dễ dàng tạo một mẫu đơn [một phiên bản] vì cách trình tải mô-đun hoạt động bằng cách lưu vào bộ đệm phản hồi của tệp đã nhập trước đó
Lược đồ Mongoose vs. Kiểu mẫu
Mô hình Mongoose là một trình bao bọc trên lược đồ Mongoose. Lược đồ Mongoose xác định cấu trúc của tài liệu, giá trị mặc định, trình xác thực, v.v. , trong khi mô hình Mongoose cung cấp giao diện cho cơ sở dữ liệu để tạo, truy vấn, cập nhật, xóa bản ghi, v.v.
Tạo một mô hình Mongoose chủ yếu bao gồm ba phần
1. Tham khảo Mongoose
let mongoose = require['mongoose']
Tham chiếu này sẽ giống như tham chiếu được trả về khi chúng tôi kết nối với cơ sở dữ liệu, có nghĩa là các định nghĩa mô hình và lược đồ sẽ không cần kết nối rõ ràng với cơ sở dữ liệu
2. Xác định lược đồ
Lược đồ xác định các thuộc tính tài liệu thông qua một đối tượng trong đó tên khóa tương ứng với tên thuộc tính trong bộ sưu tập
________số 8Ở đây, chúng tôi xác định một thuộc tính được gọi là email với kiểu lược đồ Chuỗi ánh xạ tới trình xác nhận nội bộ sẽ được kích hoạt khi mô hình được lưu vào cơ sở dữ liệu. Nó sẽ thất bại nếu kiểu dữ liệu của giá trị không phải là kiểu chuỗi
Các loại lược đồ sau đây được cho phép
- Mảng
- Boolean
- Đệm
- Ngày tháng
- Hỗn hợp [Một loại dữ liệu chung/linh hoạt]
- Con số
- ID đối tượng
- Chuỗi
Hỗn hợp và ObjectId được xác định theo
let mongoose = require['mongoose']
53. Xuất một mô hình
Chúng ta cần gọi hàm tạo mô hình trên cá thể Mongoose và chuyển cho nó tên của bộ sưu tập và tham chiếu đến định nghĩa lược đồ
npm install mongoose validator
0Hãy kết hợp đoạn mã trên vào
let mongoose = require['mongoose']
6 để xác định nội dung của một mô hình email cơ bảnnpm install mongoose validator
2Một định nghĩa lược đồ phải đơn giản, nhưng độ phức tạp của nó thường dựa trên các yêu cầu của ứng dụng. Các lược đồ có thể được sử dụng lại và chúng cũng có thể chứa một số lược đồ con. Trong ví dụ trên, giá trị của thuộc tính email là một loại giá trị đơn giản. Tuy nhiên, nó cũng có thể là một loại đối tượng với các thuộc tính bổ sung trên đó
Chúng ta có thể tạo một thể hiện của mô hình mà chúng ta đã xác định ở trên và điền vào đó bằng cú pháp sau
npm install mongoose validator
3Hãy nâng cao lược đồ Email để biến thuộc tính email thành một trường bắt buộc, duy nhất và chuyển đổi giá trị thành chữ thường trước khi lưu nó. Chúng tôi cũng có thể thêm chức năng xác thực để đảm bảo rằng giá trị là địa chỉ email hợp lệ. Chúng tôi sẽ tham khảo và sử dụng thư viện trình xác thực đã cài đặt trước đó
npm install mongoose validator
4Hoạt động cơ bản
Mongoose có API linh hoạt và cung cấp nhiều cách để hoàn thành nhiệm vụ. Chúng tôi sẽ không tập trung vào các biến thể vì điều đó nằm ngoài phạm vi của bài viết này, nhưng hãy nhớ rằng hầu hết các thao tác có thể được thực hiện theo nhiều cách hoặc theo cú pháp hoặc thông qua kiến trúc ứng dụng
Tạo bản ghi
Hãy tạo một phiên bản của mô hình email và lưu nó vào cơ sở dữ liệu
npm install mongoose validator
5Kết quả là một tài liệu được trả về khi lưu thành công
npm install mongoose validator
0Các trường sau được trả về [các trường bên trong có tiền tố là dấu gạch dưới]
- Trường
7 được Mongo tạo tự động và là khóa chính của bộ sưu tập. Giá trị của nó là một định danh duy nhất cho tài liệulet mongoose = require['mongoose']
- Giá trị của trường
8 được trả về. Lưu ý rằng nó được viết thường vì chúng tôi đã chỉ định thuộc tínhlet mongoose = require['mongoose']
9 trong lược đồlet mongoose = require['mongoose']
0 là thuộc tính versionKey được đặt trên mỗi tài liệu khi được Mongoose tạo lần đầu tiên. Giá trị của nó chứa bản sửa đổi nội bộ của tài liệulet emailSchema = new mongoose.Schema[{ email: String }]
Nếu bạn cố lặp lại thao tác lưu ở trên, bạn sẽ gặp lỗi vì chúng tôi đã chỉ định rằng trường email phải là duy nhất
Tìm nạp bản ghi
Hãy thử truy xuất bản ghi mà chúng ta đã lưu vào cơ sở dữ liệu trước đó. Lớp mô hình hiển thị một số phương thức tĩnh và cá thể để thực hiện các thao tác trên cơ sở dữ liệu. Bây giờ chúng tôi sẽ cố gắng tìm bản ghi mà chúng tôi đã tạo trước đó bằng cách sử dụng phương thức tìm và chuyển email làm cụm từ tìm kiếm
npm install mongoose validator
1Tài liệu được trả về sẽ tương tự như những gì được hiển thị khi chúng tôi tạo bản ghi
npm install mongoose validator
0Cập nhật bản ghi
Hãy sửa đổi bản ghi ở trên bằng cách thay đổi địa chỉ email và thêm một trường khác vào đó, tất cả chỉ trong một thao tác. Vì lý do hiệu suất, Mongoose sẽ không trả lại tài liệu đã cập nhật, vì vậy chúng tôi cần chuyển một tham số bổ sung để yêu cầu nó
npm install mongoose validator
3Tài liệu được trả lại sẽ chứa email được cập nhật
npm install mongoose validator
4Xóa hồ sơ
Chúng tôi sẽ sử dụng cuộc gọi
let emailSchema = new mongoose.Schema[{
email: String
}]
1 để xóa một bản ghi. Nó trả về tài liệu gốc đã bị xóanpm install mongoose validator
5Người giúp việc
Chúng tôi đã xem xét một số chức năng cơ bản ở trên được gọi là hoạt động CRUD [Tạo, Đọc, Cập nhật, Xóa], nhưng Mongoose cũng cung cấp khả năng định cấu hình một số loại phương thức và thuộc tính của trình trợ giúp. Chúng có thể được sử dụng để đơn giản hóa hơn nữa làm việc với dữ liệu
Hãy tạo một lược đồ người dùng trong
let emailSchema = new mongoose.Schema[{
email: String
}]
2 với các trường_______83 và let emailSchema = new mongoose.Schema[{
email: String
}]
4npm install mongoose validator
6Tài sản ảo
Thuộc tính ảo không được lưu vào cơ sở dữ liệu. Chúng tôi có thể thêm nó vào lược đồ của mình với tư cách là người trợ giúp để nhận và đặt giá trị
Hãy tạo một thuộc tính ảo có tên là
let emailSchema = new mongoose.Schema[{
email: String
}]
5 có thể được sử dụng để đặt giá trị trên let emailSchema = new mongoose.Schema[{
email: String
}]
3 và let emailSchema = new mongoose.Schema[{
email: String
}]
4 và truy xuất chúng dưới dạng giá trị kết hợp khi đọcnpm install mongoose validator
7Các cuộc gọi lại cho get và set phải sử dụng từ khóa hàm vì chúng ta cần truy cập mô hình thông qua từ khóa
let emailSchema = new mongoose.Schema[{
email: String
}]
8. Sử dụng các hàm mũi tên béo sẽ thay đổi những gì mà let emailSchema = new mongoose.Schema[{
email: String
}]
8 đề cập đếnBây giờ, chúng ta có thể đặt
let emailSchema = new mongoose.Schema[{
email: String
}]
3 và let emailSchema = new mongoose.Schema[{
email: String
}]
4 bằng cách gán giá trị cho let emailSchema = new mongoose.Schema[{
email: String
}]
5npm install mongoose validator
8Đoạn mã trên sẽ xuất ra như sau
npm install mongoose validator
9Phương thức sơ thẩm
Chúng ta có thể tạo các phương thức trợ giúp tùy chỉnh trên lược đồ và truy cập chúng thông qua phiên bản mô hình. Các phương thức này sẽ có quyền truy cập vào đối tượng mô hình và chúng có thể được sử dụng khá sáng tạo. Chẳng hạn, chúng ta có thể tạo một phương thức để tìm tất cả những người có cùng tên với đối tượng hiện tại
Trong ví dụ này, hãy tạo một hàm để trả về tên viết tắt cho người dùng hiện tại. Hãy thêm một phương thức trợ giúp tùy chỉnh có tên là
npm install mongoose validator
03 vào lược đồlet mongoose = require['mongoose'];
const server = '127.0.0.1:27017'; // REPLACE WITH YOUR DB SERVER
const database = 'fcc-Mail'; // REPLACE WITH YOUR DB NAME
class Database {
constructor[] {
this._connect[]
}
_connect[] {
mongoose.connect[`mongodb://${server}/${database}`]
.then[[] => {
console.log['Database connection successful']
}]
.catch[err => {
console.error['Database connection error']
}]
}
}
module.exports = new Database[]
0Phương pháp này sẽ có thể truy cập thông qua một phiên bản mô hình
let mongoose = require['mongoose'];
const server = '127.0.0.1:27017'; // REPLACE WITH YOUR DB SERVER
const database = 'fcc-Mail'; // REPLACE WITH YOUR DB NAME
class Database {
constructor[] {
this._connect[]
}
_connect[] {
mongoose.connect[`mongodb://${server}/${database}`]
.then[[] => {
console.log['Database connection successful']
}]
.catch[err => {
console.error['Database connection error']
}]
}
}
module.exports = new Database[]
1Phương thức tĩnh
Tương tự như các phương thức thể hiện, chúng ta có thể tạo các phương thức tĩnh trên lược đồ. Hãy tạo một phương thức để truy xuất tất cả người dùng trong cơ sở dữ liệu
let mongoose = require['mongoose'];
const server = '127.0.0.1:27017'; // REPLACE WITH YOUR DB SERVER
const database = 'fcc-Mail'; // REPLACE WITH YOUR DB NAME
class Database {
constructor[] {
this._connect[]
}
_connect[] {
mongoose.connect[`mongodb://${server}/${database}`]
.then[[] => {
console.log['Database connection successful']
}]
.catch[err => {
console.error['Database connection error']
}]
}
}
module.exports = new Database[]
2Gọi
npm install mongoose validator
04 trên lớp Model sẽ trả về tất cả người dùng trong cơ sở dữ liệulet mongoose = require['mongoose'];
const server = '127.0.0.1:27017'; // REPLACE WITH YOUR DB SERVER
const database = 'fcc-Mail'; // REPLACE WITH YOUR DB NAME
class Database {
constructor[] {
this._connect[]
}
_connect[] {
mongoose.connect[`mongodb://${server}/${database}`]
.then[[] => {
console.log['Database connection successful']
}]
.catch[err => {
console.error['Database connection error']
}]
}
}
module.exports = new Database[]
3Thêm các phương thức tĩnh và thể hiện là một cách tiếp cận hay để triển khai giao diện cho các tương tác cơ sở dữ liệu trên các bộ sưu tập và bản ghi
Phần mềm trung gian
Phần mềm trung gian là các chức năng chạy ở các giai đoạn cụ thể của đường ống. Mongoose hỗ trợ phần mềm trung gian cho các hoạt động sau
- tổng hợp
- Tài liệu
- Kiểu mẫu
- Truy vấn
Chẳng hạn, các mô hình có các hàm
npm install mongoose validator
05 và npm install mongoose validator
06 nhận hai tham số- Loại sự kiện ['init', 'xác thực', 'lưu', 'xóa']
- Một cuộc gọi lại được thực hiện với điều này tham chiếu đến phiên bản mô hình
Hãy thử một ví dụ bằng cách thêm hai trường có tên là
npm install mongoose validator
07 và npm install mongoose validator
08 vào lược đồ của chúng talet mongoose = require['mongoose'];
const server = '127.0.0.1:27017'; // REPLACE WITH YOUR DB SERVER
const database = 'fcc-Mail'; // REPLACE WITH YOUR DB NAME
class Database {
constructor[] {
this._connect[]
}
_connect[] {
mongoose.connect[`mongodb://${server}/${database}`]
.then[[] => {
console.log['Database connection successful']
}]
.catch[err => {
console.error['Database connection error']
}]
}
}
module.exports = new Database[]
4Khi
npm install mongoose validator
09 được gọi, có một sự kiện npm install mongoose validator
20 và npm install mongoose validator
21 được kích hoạt. Đối với tham số thứ hai, bạn có thể chuyển một hàm được gọi khi sự kiện được kích hoạt. Các chức năng này lấy tham số cho chức năng tiếp theo trong chuỗi phần mềm trung gianHãy thêm một pre-save hook và đặt giá trị cho
npm install mongoose validator
07 và npm install mongoose validator
08let mongoose = require['mongoose'];
const server = '127.0.0.1:27017'; // REPLACE WITH YOUR DB SERVER
const database = 'fcc-Mail'; // REPLACE WITH YOUR DB NAME
class Database {
constructor[] {
this._connect[]
}
_connect[] {
mongoose.connect[`mongodb://${server}/${database}`]
.then[[] => {
console.log['Database connection successful']
}]
.catch[err => {
console.error['Database connection error']
}]
}
}
module.exports = new Database[]
5Hãy tạo và lưu mô hình của chúng ta
let mongoose = require['mongoose'];
const server = '127.0.0.1:27017'; // REPLACE WITH YOUR DB SERVER
const database = 'fcc-Mail'; // REPLACE WITH YOUR DB NAME
class Database {
constructor[] {
this._connect[]
}
_connect[] {
mongoose.connect[`mongodb://${server}/${database}`]
.then[[] => {
console.log['Database connection successful']
}]
.catch[err => {
console.error['Database connection error']
}]
}
}
module.exports = new Database[]
6Bạn sẽ thấy các giá trị cho
npm install mongoose validator
07 và npm install mongoose validator
08 khi bản ghi được tạo được in ralet mongoose = require['mongoose'];
const server = '127.0.0.1:27017'; // REPLACE WITH YOUR DB SERVER
const database = 'fcc-Mail'; // REPLACE WITH YOUR DB NAME
class Database {
constructor[] {
this._connect[]
}
_connect[] {
mongoose.connect[`mongodb://${server}/${database}`]
.then[[] => {
console.log['Database connection successful']
}]
.catch[err => {
console.error['Database connection error']
}]
}
}
module.exports = new Database[]
7bổ sung
Giả sử rằng chúng tôi muốn theo dõi thời điểm bản ghi được tạo và cập nhật lần cuối trên mọi bộ sưu tập trong cơ sở dữ liệu của chúng tôi. Thay vì lặp lại quy trình trên, chúng ta có thể tạo một plugin và áp dụng nó cho mọi lược đồ
Hãy tạo một tệp
npm install mongoose validator
26 và sao chép chức năng trên thành một mô-đun có thể tái sử dụnglet mongoose = require['mongoose'];
const server = '127.0.0.1:27017'; // REPLACE WITH YOUR DB SERVER
const database = 'fcc-Mail'; // REPLACE WITH YOUR DB NAME
class Database {
constructor[] {
this._connect[]
}
_connect[] {
mongoose.connect[`mongodb://${server}/${database}`]
.then[[] => {
console.log['Database connection successful']
}]
.catch[err => {
console.error['Database connection error']
}]
}
}
module.exports = new Database[]
8Để sử dụng plugin này, chúng tôi chỉ cần chuyển nó đến các lược đồ sẽ được cung cấp chức năng này
let mongoose = require['mongoose'];
const server = '127.0.0.1:27017'; // REPLACE WITH YOUR DB SERVER
const database = 'fcc-Mail'; // REPLACE WITH YOUR DB NAME
class Database {
constructor[] {
this._connect[]
}
_connect[] {
mongoose.connect[`mongodb://${server}/${database}`]
.then[[] => {
console.log['Database connection successful']
}]
.catch[err => {
console.error['Database connection error']
}]
}
}
module.exports = new Database[]
9Xây dựng truy vấn
Mongoose có API rất phong phú xử lý nhiều thao tác phức tạp được hỗ trợ bởi MongoDB. Hãy xem xét một truy vấn mà chúng ta có thể xây dựng dần dần các thành phần truy vấn
Trong ví dụ này, chúng ta sẽ
- Tìm tất cả người dùng
- Bỏ qua 100 bản ghi đầu tiên
- Giới hạn kết quả ở 10 bản ghi
- Sắp xếp kết quả theo trường FirstName
- Chọn họ tên
- Thực hiện truy vấn đó
let mongoose = require['mongoose']
0Đóng cửa
Chúng tôi hầu như không làm trầy xước bề mặt khám phá một số khả năng của Mongoose. Đó là một thư viện phong phú với đầy đủ các tính năng hữu ích và mạnh mẽ giúp bạn vui vẻ làm việc với các mô hình dữ liệu trong lớp ứng dụng
Mặc dù bạn có thể tương tác trực tiếp với Mongo bằng Mongo Driver, nhưng Mongoose sẽ đơn giản hóa tương tác đó bằng cách cho phép bạn lập mô hình mối quan hệ giữa dữ liệu và xác thực chúng một cách dễ dàng
Sự thật thú vị. Mongoose được tạo ra bởi Valeri Karpov, một kỹ sư vô cùng tài năng. Anh ấy đã đặt ra thuật ngữ The MEAN Stack
Nếu bài viết này hữu ích, ???
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
Nếu bài viết này hữu ích, hãy tweet nó
Học cách viết mã miễn phí. Chương trình giảng dạy mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu