Trong bài học trước,
chúng tôi đã học về trình điều khiển MongoDB.
Điều đó cho phép ứng dụng nút của chúng tôi giao tiếp với một máy chủ MongoDB,
và cũng lưu trữ và truy xuất tài liệu từ máy chủ MongoDB.
Chúng tôi cũng thấy rằng trình điều khiển MongoDB cung cấp
cho chúng tôi nhiều phương pháp cho phép chúng tôi tạo ra các bộ sưu tập trong một cơ sở dữ liệu,
thêm tài liệu vào các bộ sưu tập,
và sau đó thực hiện các thao tác khác nhau trên các tài liệu trong một bộ sưu tập.
Bây giờ, khi các tài liệu được lưu trữ trong cơ sở dữ liệu,
trình điều khiển MongoDB tự nó áp đặt không có cấu trúc trên các tài liệu.
Nếu chúng ta cần phải có cấu trúc cụ thể cho các tài liệu và thực thi cấu trúc đó,
thì chúng ta cần phải sử dụng mô-đun nút Mongoose cho phép chúng ta xác định
một lược đồ và một cấu trúc cho các tài liệu của chúng tôi được lưu trữ trong cơ sở dữ liệu MongoDB của chúng tôi,
và thực thi chặt chẽ cấu trúc.
Chúng ta hãy xem xét thêm chi tiết trong bài giảng này và các bài tập theo sau bài giảng này.
Như chúng ta đã biết,
MongoDB lưu trữ dữ liệu trong các bộ sưu tập trong một cơ sở dữ liệu.
Những bộ sưu tập này bao gồm một bộ sưu tập các tài liệu.
Bản thân các tài liệu được lưu trữ trong
một cơ sở dữ liệu MongoDB không có cấu trúc cụ thể nào áp đặt lên tài liệu.
Bất kỳ tài liệu nào có thể được lưu trữ trong bất kỳ bộ sưu tập nào.
MongoDB dựa vào nhà phát triển để thực thi cấu trúc trên các tài liệu,
và đưa ra trách nhiệm hoàn toàn cho nhà phát triển để đảm bảo rằng các tài liệu
của cấu trúc chính xác được thêm vào và duy trì trong các bộ sưu tập khác nhau.
Bây giờ, nó là rất dễ dàng để vi phạm điều này.
Vì vậy, ví dụ, mặc dù bạn có thể bắt đầu với giả định
rằng một kết nối cụ thể sẽ có tài liệu của một cấu trúc nhất định,
bạn có thể dễ dàng chèn tài liệu không nhất thiết phải tuân thủ cấu trúc.
Nếu bạn rất đặc biệt rằng cấu trúc của các tài liệu trong
một bộ sưu tập luôn có một cấu trúc cụ thể,
và sẽ luôn luôn có tập hợp các trường cụ thể,
sau đó MongoDB chính nó không áp đặt rằng cũng
không trình điều khiển nút MongoDB mà chúng ta đã thấy trong bài học trước đó.
Đây là nơi chúng ta sẽ cần một cách chính thức hơn để áp đặt
cấu trúc trên các tài liệu được lưu trữ trong một bộ sưu tập trong một cơ sở dữ liệu MongoDB.
Đây là nơi mà mô-đun nút Mongoose đến với sự giúp đỡ của chúng tôi.
Mô-đun nút Mongoose áp đặt
một cấu trúc chuẩn hóa cho các tài liệu được lưu trữ trong một bộ sưu tập cụ thể.
Vì vậy, đó là lý do tại sao chúng tôi thường nghe mọi người đề cập đến điều này như là Mongoose OM.
Bản thân OD được một số người hiểu là
Mô hình Dữ liệu Đối tượng hoặc đôi khi được gọi là Đối tượng Document Mapping,
hoặc một số người đề cập đến nó là ORM hoặc Object Relational Mapping.
Bây giờ, khi chúng ta nói về quan hệ áp dụng nhiều hơn cho cơ sở dữ liệu quan hệ,
nhưng sau đó với cơ sở dữ liệu SQL chúng ta cần một cách rõ ràng đối tượng để
ánh xạ quan hệ để được đưa vào giữa cơ sở dữ liệu và ứng dụng của chúng ta.
Bởi vì trong ứng dụng chúng ta sẽ xem xét các
đối tượng nhưng lưu trữ của họ trong một cơ sở dữ liệu SQL sẽ ở dạng hồ sơ,
và do đó bạn cần một ánh xạ rõ ràng.
Như chúng ta đã thấy với cơ sở dữ liệu NoSQL,
điều này không được yêu cầu rõ ràng.
Nhưng nếu bạn cần phải áp đặt cấu trúc trên tài liệu của bạn được lưu trữ trong một bộ sưu tập
thì việc sử dụng Mongoose để áp đặt cấu trúc này là rất, rất hữu ích.
Cách Mongoose đi
xung quanh áp đặt cấu trúc trên các tài liệu là thông qua việc sử dụng lược đồ.
Schema, xác định cấu trúc của tài liệu của họ.
Hãy nói về điều đó một chút chi tiết hơn.
Vì vậy, những gì chính xác là lược đồ mongoose,
và những gì nó mang lại cho bảng?
Mongoose schema, ngụ ý một cấu trúc trên
dữ liệu được lưu trữ trong một tài liệu trong cơ sở dữ liệu của bạn.
Vì vậy, nó xác định tất cả các trường của tài liệu của bạn,
và cũng xác định các loại của các trường,
và cũng có thể cung cấp cho chúng tôi các
tính năng bổ sung có thể cho phép xác thực trên các trường này.
Vì vậy, ví dụ, các loại giản đồ khác nhau được hỗ trợ trong Mongoose bao gồm: Chuỗi
, Số, Ngày, Bộ đệm, Boolean,
hỗn hợp, đối tượng ID và mảng.
Đặc biệt, chúng ta sẽ xem xét số chuỗi,
và một ngày, và Boolean trong bài tập sau.
Chúng ta sẽ xem xét một số trong những bài tập khác trong các bài tập sau này.
Đặc biệt, chú ý việc sử dụng kiểu giản đồ mảng.
Vì vậy, một kiểu giản đồ mảng sẽ cho phép bạn
tạo ra một mảng các tài liệu phụ bên trong tài liệu.
Tôi sẽ nói về điều đó trong một thời gian ngắn.
Một khi bạn xác định một giản đồ,
giản đồ sau đó được sử dụng trong Mongoose để tạo ra một hàm mô hình,
và đó là những gì cho phép bạn xác định cấu trúc cho các tài liệu của bạn trong cơ sở dữ liệu.
Bản thân Schemas có thể có làm tổ.
Vì vậy, có nghĩa là bạn có thể có tài liệu phụ được kèm theo bên trong một tài liệu.
Các tài liệu phụ thường được chứa
hoặc thông qua chỉ định một lược đồ bổ sung,
và sau đó xác định một trong các lĩnh vực của lược đồ để được tắt loại của lược đồ khác.
Hoặc bạn thậm chí có thể đi với một mảng của một
kiểu giản đồ khác trong một giản đồ thứ hai mà bạn xác định.
Hãy xem một ví dụ để làm rõ một số trong số này một cách chi tiết hơn.
Ví dụ này sẽ là từ bài tập mà bạn sẽ làm ngay sau bài giảng này.
Trước khi tôi có thể nói về lược đồ và mô hình trong Mongoose, chúng ta
hãy hiểu tại sao chúng ta sẽ cần điều đó.
Nếu bạn đã thực hiện các góc trước,
hoặc ion, hoặc khóa học kịch bản gốc,
bạn đã thấy rằng chúng tôi đại diện cho
dữ liệu khác nhau mà chúng tôi sử dụng trong các ứng dụng của chúng tôi dưới dạng chuỗi JSON.
Vì vậy, trong ứng dụng của chúng tôi, chúng tôi xác định một bộ sưu tập được gọi là món ăn.
Trong một bộ sưu tập món ăn,
mỗi món ăn sẽ chứa một tập hợp các thuộc tính nhất định được định nghĩa dưới dạng chuỗi JSON,
như bạn thấy trong ví dụ này ở đây.
Vì vậy, các món ăn là một mảng các loại món ăn,
và mỗi món ăn chính nó sẽ chứa một tên,
một hình ảnh, một loại,
một nhãn, và như vậy.
Ngoài ra, bên trong tài liệu món ăn chính nó,
bạn sẽ có ý kiến được lưu trữ như một mảng của một lần nữa, -
tài liệu JSON có chứa các lĩnh vực cụ thể bước.
Vì vậy, mỗi nhận xét, ví dụ,
chứa một tác giả nhận xét xếp hạng và một trường ngày như bạn thấy trong ví dụ này ở đây.
Vì vậy, bạn thấy rằng có một cấu trúc rõ ràng cho
mỗi tài liệu xác định một món ăn được lưu trữ trong cơ sở dữ liệu của chúng tôi.
Nhiều món ăn rõ ràng sẽ được lưu trữ dưới dạng một bộ sưu tập trong cơ sở dữ liệu của chúng tôi,
và có thể được nhóm lại với nhau và gửi qua như một mảng các
món ăn cho ứng dụng khách hàng của chúng tôi để được sử dụng.
Bây giờ chúng ta đã hiểu làm thế nào điều này được định nghĩa, bây giờ,
làm thế nào để điều này liên quan đến lược đồ Mongoose và mô hình mà chúng ta xác định trong Mongoose?
Bây giờ, lưu ý cấu trúc của một tài liệu món ăn điển hình ở đây.
Vì vậy, điều này có thể dễ dàng ánh xạ vào một tài liệu MongoDB trong một bộ sưu tập,
có lẽ được đặt tên là bộ sưu tập món ăn.
Vì vậy, chúng ta thấy rằng có một cấu trúc rõ ràng cho chính tài liệu.
Bây giờ, làm thế nào để chúng ta phản ánh điều này trong một lược đồ trong ứng dụng Mongoose của chúng tôi?
Như bạn sẽ học trong bài tập,
chúng ta sẽ thấy rằng chúng ta sẽ xác định lược đồ trong Mongoose.
Vì vậy, giản đồ được định nghĩa là một giản đồ Mongoose ở đây.
Ví dụ, một CommentSchema được hiển thị ở đây.
CommentSchema, như bạn có thể thấy,
chứa ba lĩnh vực khác nhau: đánh giá, bình luận
và lĩnh vực tác giả,
và cũng dấu thời gian ở đây.
Dấu thời gian cho phép bạn có hai trường khác nhau
trong tài liệu: trường được tạo ra tại và trường được cập nhật tại,
cả hai đều là dấu thời gian được lưu trữ dưới dạng chuỗi ngày ISO trong tài liệu.
Bây giờ, bản thân đánh giá sẽ là một giá trị số nguyên.
Vì vậy, trong thuật ngữ Mongoose,
nó sẽ được lưu trữ dưới dạng một
số, loại sẽ là một số.
Bạn thậm chí có thể chỉ định giá trị tối thiểu và tối đa.
Bạn cũng có thể chỉ định rằng trường cụ thể này là bắt buộc, do
đó, có nghĩa là mọi tài liệu của loại nhận xét phải chứa một trường xếp hạng.
Tương tự như vậy, bạn cũng có thể xác định một trường nhận xét,
đó là của chuỗi loại.
Vì vậy, rõ ràng, một nhận xét là không có gì ngoài một chuỗi có chứa một số thông tin,
và điều này cũng có thể được định nghĩa là một trường bắt buộc,
có nghĩa là mỗi tài liệu nên chứa một nhận xét,
và cũng là một trường tác giả,
mà cũng là của chuỗi loại.
Vì vậy, bạn thấy rằng bằng cách xác định lược đồ này trong định dạng này.
Như chúng ta đã học được trong các cuộc thảo luận trước đó một chút,
giản đồ được định nghĩa bằng cách sử dụng các loại khác nhau mà chúng ta có trong ứng dụng Mongoose của chúng tôi.
Vì vậy, trong lược đồ, một lần nữa,
bạn thấy ba lĩnh vực khác nhau ở đây,
đánh giá, bình luận và tác giả ở đây,
và mỗi trong số đó có một loại cụ thể được đưa ra,
và sau đó cho dù điều này là bắt buộc hay không.
Vì vậy, do đó, bạn đang áp đặt một cấu trúc nghiêm ngặt
trên các tài liệu nhận xét sẽ được lưu trữ trong ứng dụng của bạn.
Bây giờ chúng tôi đã xác định một lược đồ bình luận, chúng tôi có thể sau đó,
như bạn nhận thấy từ ví dụ về loại dữ liệu mà chúng tôi yêu cầu trong ứng dụng của chúng
tôi, chúng tôi có một tài liệu món ăn chính nó.
Tài liệu món ăn chứa các lĩnh vực khác nhau.
Ở đây, trong bài tập,
trước tiên chúng tôi sẽ giới thiệu chỉ hai lĩnh vực vào tài liệu món ăn
, tên và mô tả.
Trong bài học tiếp theo,
chúng tôi sẽ giới thiệu các trường còn lại cho DishSchema.
Bây giờ, vì vậy tên,
như trong trường hợp này,
là của chuỗi loại.
Chúng ta cũng có thể xác định rằng đây là trường bắt buộc, có
nghĩa là mọi tài liệu phải chứa trường tên.
Chúng ta cũng có thể xác định rằng trường tên là duy nhất, có
nghĩa là không có hai tài liệu có thể có chính xác cùng một giá trị tên trong tài liệu.
Vì vậy, điều đó đảm bảo rằng mỗi tài liệu sẽ có
một trường tên duy nhất trong đó và một trường mô tả,
mà là một lần nữa của chuỗi loại,
nhưng cũng được chỉ định theo yêu cầu.
Bây giờ, như chúng ta đã thấy trong ví dụ,
một tài liệu món ăn chứa nhiều ý kiến kèm theo bên trong tài liệu.
Bây giờ, trong Mongoose, điều này được hỗ trợ thông qua việc sử dụng các tài liệu phụ.
Vì vậy, nếu bạn xác định một giản đồ trước đó,
ví dụ, chúng tôi đã xác định một CommentSchema ở đây,
bạn cũng có thể xác định một trường vào một giản đồ khác mà bạn xác
định và sau đó xác định rằng trường đó sẽ
thuộc loại giản đồ trước đó mà bạn đã xác định.
Vì vậy, trong trường hợp này,
trường ý kiến, tôi xác định nó như là một mảng,
vì vậy bạn thấy việc sử dụng một loại mảng trong lược đồ của bạn mà bạn đang xác định ở đây,
và sau đó mảng của các loại CommentSchema.
Vì vậy, đây là một mảng các ý kiến sẽ được bao gồm trong mỗi tài liệu món ăn.
Vì vậy, do đó, bạn có thể có
nhiều hơn một chú thích tiểu tài liệu kèm theo bên trong một tài liệu món ăn.
Vì vậy, việc xác định cấu trúc như thế này cho phép chúng ta hỗ trợ
cấu trúc chuỗi JSON tương ứng mà chúng ta đã xác định
cho một tài liệu món ăn hoặc chúng ta đã thấy trong ví dụ trước đó.
Bây giờ, một khi chúng ta xác định lược đồ,
để tận dụng điều này trong ứng dụng của chúng
tôi, chúng ta cần phải tạo ra một mô hình từ lược đồ đó mà chúng tôi vừa xác định.
Vì vậy, trong ứng dụng của chúng
tôi, chúng tôi sẽ xác định một mô hình Mongoose và xác định rằng các mô hình
là tắt loại DishSchema trong ví dụ này.
Không chỉ vậy, bạn cũng sẽ đặt tên cho mô hình ở đây.
Vì vậy, khi bạn đặt tên cho mô hình ở đây,
chúng tôi đang chỉ định tên như món ăn.
Bây giờ, khi bạn sử dụng mô hình món ăn này trong
ứng dụng nút của chúng tôi, nơi chúng tôi đang sử dụng Mongoose,
sau đó điều này sẽ được chuyển đổi và ánh xạ vào một bộ sưu tập trong cơ sở dữ liệu MongoDB của tôi.
Bộ sưu tập chính nó sẽ được đặt tên như các món ăn.
Vì vậy, Mongoose tự động biết rằng khi bạn chỉ định một tên ở đây,
nó sẽ tự động xây dựng số nhiều
của tên đó và sau đó cung cấp cho bộ sưu tập tên,
đó là số nhiều của tên mô hình mà bạn chỉ định trong ví dụ này ở đây.
Vì vậy, khi tôi nói món ăn ở đây,
sau đó Mongoose sẽ tự động ánh xạ này vào
bộ sưu tập món ăn trong cơ sở dữ liệu MongoDB.
Làm thế nào để nó biết làm thế nào để chuyển đổi tên số ít này thành một số nhiều?
Mongoose tự động có một cơ chế tích hợp
cho phép nó xây dựng các số nhiều của các từ tiếng Anh chuẩn.
Vì vậy, nếu bạn nói món ăn,
nó sẽ xây dựng các món ăn.
Nếu bạn nói lãnh đạo, nó sẽ xây dựng số nhiều của nó như là lãnh đạo, và vân vân.
Vì vậy, điều này đã được xây dựng vào mô-đun nút Mongoose.
Vì vậy, đó là lý do tại sao khi tôi chỉ định điều này như là một loại mô hình món ăn,
sau đó Mongoose sẽ xây dựng bộ sưu tập món ăn trong cơ sở dữ liệu MongoDB của tôi,
và sau đó bộ sưu tập món ăn đó sẽ lưu trữ
các tài liệu khác nhau của loại món ăn trong đó.
Một khi chúng tôi đã tạo ra rằng, thông thường,
khi chúng tôi khai báo mô hình trong ứng dụng của
chúng tôi, chúng tôi sẽ lưu trữ chúng trong một thư mục con tên mô hình, chỉ để thuận tiện.
Bạn không cần phải làm điều đó,
nhưng chỉ để tổ chức ứng dụng của bạn,
chúng tôi thường sẽ lưu trữ nó trong một thư mục có tên là model.
Sau đó, giản đồ và mô hình sẽ được
định nghĩa trong một tập tin như thế này như bạn thấy trong ví dụ ở đây,
điều này được gọi là dishes.js, và sau đó điều này sẽ được xuất khẩu bởi vì đây là một mô-đun nút.
Điều này sẽ được xuất khẩu từ tập tin này để nó có thể được bao gồm vào các ứng dụng nút,
nơi chúng tôi sẽ làm cho việc sử dụng
lược đồ này và mô hình mà chúng tôi vừa xác định ở đây.
Với sự hiểu biết nhanh chóng này về giản đồ và mô hình và việc
sử dụng nó trong việc xác định cấu trúc cho một tài liệu mà chúng ta lưu trữ trong một MongoDB, chúng ta
hãy trở lại và hiểu thêm một chút về những gì Mongoose cung cấp cho chúng ta.
Ngoài ra, Mongoose cho phép chúng ta thiết lập kết nối với máy chủ MongoDB.
Mongoose nội bộ sử dụng
trình điều khiển MongoDB mà chúng tôi đã sử dụng trong bài tập trước đó.
Vì vậy, Mongoose phụ thuộc vào trình điều khiển MongoDB, vì vậy,
có nghĩa là từ ứng dụng nút dựa trên Mongoose của
bạn, bạn có thể sử dụng tất cả các phương pháp đã có
sẵn từ trình điều khiển MongoDB cũng nếu bạn chọn,
nhưng Mongoose chính nó có một bộ sưu tập riêng của các phương pháp mà chúng ta
có thể làm sử dụng để tương tác với cơ sở dữ liệu MongoDB,
như chúng ta sẽ thấy trong bài tập đó sau.
Hãy để tôi chỉ cho bạn một thời gian ngắn làm thế nào chúng tôi sẽ thiết lập một kết nối với cơ sở dữ liệu,
và bạn sẽ làm điều này trong bài tập sau.
Vì vậy, giống như chúng tôi tuyên bố URL trong trường hợp
của ứng dụng nút MongoDB trong bài học trước đó,
chúng tôi vẫn sẽ khai báo URL cho ứng dụng của chúng tôi.
Sau đó chúng ta sẽ sử dụng phương thức kết nối Mongoose
và cung cấp URL cho phương thức kết nối Mongoose,
và điều này sẽ thiết lập kết nối đến cơ sở dữ liệu.
Với sự hiểu biết nhanh chóng này về Mongoose và vai trò của Mongoose
trong việc hỗ trợ chèn có cấu trúc
, lưu trữ và truy xuất tài liệu từ MongoDB của chúng tôi, chúng ta
hãy chuyển sang bài tập nơi chúng ta sẽ
có được một số trải nghiệm thực hành bằng cách sử dụng mô-đun Mongoose.