mongoose là một khung javascript, thường được sử dụng trong các ứng dụng node.js, cơ sở dữ liệu là mongodb. Trong bài viết này, tôi sẽ giới thiệu cho bạn về mongoose và mongodb, và quan trọng hơn, những công nghệ nào phù hợp với ứng dụng của bạn.
mongodb là gì?
Hãy bắt đầu với mongodb. mongodb là một cơ sở dữ liệu (database) lưu trữ dữ liệu của bạn dưới dạng tài liệu. Thông thường, các tài liệu này có cấu trúc giống như json:
Các tài liệu được đặt trong bộ sưu tập. Ví dụ, ví dụ tài liệu ở trên xác định một đối tượng người dùng. Đối tượng người dùng này thường là một phần của tập hợp được gọi là người dùng.
Một yếu tố quan trọng của mongodb là tính linh hoạt trong cấu trúc của nó. Mặc dù trong ví dụ đầu tiên, đối tượng Người dùng chứa các thuộc tính họ và tên, các thuộc tính này không bắt buộc đối với mọi tài liệu của mọi người dùng, nó là một phần của bộ sưu tập người dùng. Đó là lý do tại sao mongodb rất khác với cơ sở dữ liệu sql như máy chủ mysql hoặc microsoft sql yêu cầu một lược đồ rõ ràng được xác định cho từng đối tượng mà nó lưu trữ.
Khả năng tạo các đối tượng động và lưu trữ chúng dưới dạng tài liệu trong cơ sở dữ liệu là nơi mongoose có ích.
Cầy mangut là gì?
mongoose là một Trình vẽ bản đồ tài liệu đối tượng (odm). Điều này có nghĩa là mongoose cho phép bạn xác định các đối tượng với các lược đồ được xác định rõ ràng ánh xạ tới các tài liệu mongodb.
mongoose cung cấp một số hàm để tạo và sử dụng lược đồ. mongoose hiện có 8 loại lược đồ. Đó là:
- Chuỗi
- Số
- Ngày
- Bộ đệm
- Boolean
- Hỗn hợp
- ID đối tượng
- Mảng
- Giá trị mặc định
- Chức năng xác thực
- đại diện cho một trường bắt buộc
- Hàm get cho phép bạn thao tác dữ liệu trước khi nó được trả về dưới dạng một đối tượng
- Hàm set cho phép bạn thao tác dữ liệu trước khi lưu vào cơ sở dữ liệu
- Tạo chỉ mục cho phép tải dữ liệu nhanh hơn
- Chuyển thành chữ thường
- Chuyển nó thành chữ hoa
- Cắt dữ liệu trước khi lưu
- Biểu thức chính quy có thể giới hạn dữ liệu có thể được lưu trong quá trình xác thực
- Phép liệt kê có thể xác định danh sách các chuỗi hợp lệ
Mỗi loại dữ liệu cho phép bạn xác định:
Ngoài các tùy chọn phổ biến này, một số kiểu dữ liệu cho phép bạn tùy chỉnh thêm cách dữ liệu được lưu trữ và truy xuất trong cơ sở dữ liệu. Ví dụ: kiểu dữ liệu chuỗi cũng cho phép bạn chỉ định các tùy chọn bổ sung sau:
Cả thuộc tính số và ngày đều hỗ trợ chỉ định các giá trị tối thiểu và tối đa được phép cho trường này.
Bạn nên quen thuộc với hầu hết 8 loại dữ liệu. Tuy nhiên, bạn có thể gặp một số ngoại lệ như bộ đệm, mixin, đối tượng và mảng.
Kiểu dữ liệu đệm cho phép bạn lưu trữ dữ liệu nhị phân. Một ví dụ phổ biến về dữ liệu nhị phân là hình ảnh hoặc tệp được mã hóa, chẳng hạn như tài liệu pdf.
Kiểu kết hợp dữ liệu biến một thuộc tính thành trường “mọi thứ sẽ xảy ra” (mọi thứ sẽ xảy ra). Trường này so sánh cách các nhà phát triển sử dụng mongodb vì nó không có cấu trúc xác định. Sử dụng loại dữ liệu này một cách cẩn thận, vì bạn sẽ mất nhiều tính năng mạnh mẽ mà mongoose cung cấp, chẳng hạn như xác thực dữ liệu và phát hiện thay đổi thực thể để tự động biết để cập nhật các thuộc tính khi lưu.
Kiểu dữ liệu
objectid thường chỉ định một liên kết đến một tài liệu khác trong cơ sở dữ liệu. Ví dụ: nếu bạn có bộ sưu tập sách và tác giả, tài liệu sách có thể chứa thuộc tính objectid tham chiếu đến tác giả cụ thể của tài liệu.
Kiểu dữ liệu mảng cho phép bạn lưu trữ các mảng như javascript. Sử dụng kiểu dữ liệu mảng, bạn có thể thực hiện các hàm mảng javascript phổ biến như push, pop, shift, slice, v.v.
Tóm tắt
Trước khi chúng ta chuyển sang tạo một số mã, tôi chỉ muốn tóm tắt lại những gì chúng ta vừa học được. mongodb là một cơ sở dữ liệu cho phép bạn lưu trữ các tài liệu có cấu trúc động. Những tài liệu này được lưu trữ trong một bộ sưu tập.
mongoose là một thư viện javascript cho phép bạn xác định các lược đồ với dữ liệu được nhập rõ ràng. Sau khi một lược đồ được xác định, Mongoose cho phép bạn tạo các mô hình dựa trên một lược đồ cụ thể. Mô hình mongoose sau đó được ánh xạ tới tài liệu mongodb thông qua định nghĩa lược đồ của mô hình.
Sau khi bạn xác định lược đồ và mô hình của mình, mongoose bao gồm các chức năng khác nhau cho phép bạn xác thực, lưu, xóa và truy vấn dữ liệu bằng các hàm mongodb phổ biến. Tôi sẽ nói thêm về điều này với các ví dụ mã cụ thể.
Cài đặt mongodb
Trước khi chúng tôi bắt đầu tạo lược đồ và mô hình mongoose, mongodb phải được cài đặt và định cấu hình. Tôi khuyên bạn nên truy cập trang tải xuống của tmongodb. Đã có sẵn một số tùy chọn khác nhau để cài đặt. Tôi liên kết đến máy chủ cộng đồng. Điều này cho phép bạn cài đặt một phiên bản cụ thể cho hệ điều hành của mình. mongodb cũng cung cấp các máy chủ doanh nghiệp hỗ trợ cài đặt đám mây. Khi tôi có thể viết toàn bộ một cuốn sách về cài đặt, điều chỉnh và giám sát mongodb, tôi sẽ gắn bó với máy chủ cộng đồng.
Sau khi tải xuống và cài đặt mongodb cho hệ điều hành bạn chọn, bạn cần bắt đầu khởi chạy cơ sở dữ liệu. Tôi khuyên bạn nên truy cập tài liệu của mongodb về cách cài đặt phiên bản cộng đồng mongodb.
Tôi sẽ đợi bạn định cấu hình mongodb. Khi đã sẵn sàng, chúng ta có thể tiếp tục và thiết lập mongoose để kết nối với cơ sở dữ liệu mongodb mới được cài đặt của bạn.
Thiết lập Mongoose
mongoose là một khung javascript mà tôi sẽ sử dụng trong ứng dụng node.js của mình. Nếu bạn đã cài đặt node.js, bạn có thể chuyển sang bước tiếp theo. Nếu bạn chưa cài đặt node.js, trước tiên bạn nên truy cập trang tải xuống node.js và chọn trình cài đặt thích hợp cho hệ điều hành của mình.
Với việc thiết lập và chạy node.js, tôi sẽ tạo một ứng dụng mới và cài đặt gói mongoose npm.
Dấu nhắc lệnh nằm ở nơi bạn muốn cài đặt ứng dụng, bạn có thể chạy lệnh sau:
Để khởi chạy ứng dụng của mình, tôi đã để mọi thứ làm mặc định. Bây giờ tôi sẽ cài đặt gói mongoose như sau:
Với tất cả các điều kiện cần thiết được định cấu hình, hãy kết nối với cơ sở dữ liệu mongodb. Tôi đặt mã sau vào tệp index.js vì tôi đã chọn nó làm điểm bắt đầu cho ứng dụng của mình:
Dòng mã đầu tiên chứa thư viện mongoose. Tiếp theo, tôi sử dụng kết nối để mở kết nối đến cơ sở dữ liệu mà tôi gọi là mongoose_basics.
Hàm
kết nối chấp nhận hai tham số tùy chọn bổ sung. Tham số thứ hai là một đối tượng của các tùy chọn nơi bạn có thể xác định tên người dùng và mật khẩu nếu cần. Tham số thứ ba, hoặc tham số thứ hai nếu bạn không có bất kỳ tùy chọn nào, là hàm gọi lại sau lần thử kết nối. Hàm gọi lại có thể được sử dụng theo một trong hai cách:
Để tránh giới thiệu các hứa hẹn javascript, tôi sẽ sử dụng phương pháp đầu tiên. Đây là tệp index.js được cập nhật:
Nếu xảy ra lỗi khi kết nối với cơ sở dữ liệu, một ngoại lệ sẽ được đưa ra và tất cả các quá trình xử lý tiếp theo sẽ bị hoãn lại. Khi không có lỗi, tôi có một thông báo thành công khi đăng nhập vào bảng điều khiển.
mongoose hiện đã được thiết lập và kết nối với cơ sở dữ liệu có tên mongoose_basics. Kết nối mongodb của tôi không sử dụng tên người dùng, mật khẩu hoặc cổng đặc biệt. Nếu bạn cần đặt các tùy chọn này hoặc bất kỳ tùy chọn nào khác tại thời điểm kết nối, tôi khuyên bạn nên xem tài liệu mongoose về kết nối. Tài liệu này giải thích chi tiết về nhiều tùy chọn có sẵn và cách tạo nhiều kết nối, nhóm kết nối, bản sao, v.v.
Sau khi kết nối thành công, hãy chuyển sang xác định lược đồ cho mongoose.
định nghĩa giản đồ mongoose
Trong phần giới thiệu, tôi đã trình bày một đối tượng Người dùng với hai thuộc tính: tên và họ. Trong ví dụ sau, tôi đã dịch tài liệu sang chế độ mongoose:
Đây là một lược đồ rất cơ bản chỉ chứa hai thuộc tính không có thuộc tính nào được liên kết với chúng. Hãy mở rộng ví dụ này bằng cách chuyển đổi các thuộc tính họ và tên thành các đối tượng của thuộc tính name. Thuộc tính name sẽ bao gồm họ và tên. Tôi cũng sẽ thêm một thuộc tính đã tạo của loại ngày.
Như bạn có thể thấy, mongoose cho phép tôi tạo các lược đồ rất linh hoạt và sử dụng nhiều cách kết hợp có thể có khác nhau theo cách tôi có thể tổ chức dữ liệu của mình.
Trong ví dụ tiếp theo, tôi sẽ tạo hai lược đồ mới để minh họa cách tạo mối quan hệ với một lược đồ khác: Tác giả và Sách. Lược đồ cho cuốn sách này sẽ chứa tham chiếu đến lược đồ của tác giả.
ở trên là một lược đồ mà tác giả mở rộng từ khái niệm lược đồ người dùng mà tôi đã tạo trong ví dụ trước. Để liên kết tác giả và sách với nhau, thuộc tính đầu tiên của lược đồ tác giả là thuộc tính _id, thuộc tính kiểu objectid lược đồ. _id là một cú pháp phổ biến để tạo khóa chính trong mongoose và mongodb. Sau đó, giống như chế độ người dùng, tôi xác định thuộc tính tên có chứa họ và tên của tác giả.
Chế độ người dùng mở rộng, tác giả chứa một chế độ của một số loại chuỗi. Tôi cũng đã thêm một bộ đệm phương thức chứa ảnh hồ sơ của tác giả. Thuộc tính cuối cùng là ngày tạo của tác giả; tuy nhiên, bạn có thể nhận thấy rằng nó được tạo hơi khác vì nó đã xác định giá trị mặc định “bây giờ”. Khi tác giả được lưu vào cơ sở dữ liệu, thuộc tính này sẽ được đặt thành ngày / giờ hiện tại.
Để hoàn thành ví dụ về giản đồ, hãy sử dụng loại objectid giản đồ để tạo lược đồ sách có chứa tài liệu tham khảo về tác giả:
sách lược đồ chứa một số thuộc tính của kiểu chuỗi. Như đã đề cập ở trên, nó chứa một tham chiếu đến lược đồ tác giả. Để minh họa thêm cho định nghĩa lược đồ mạnh mẽ, hướng dẫn sử dụng lược đồ cũng chứa một loạt các xếp hạng. Mỗi xếp hạng bao gồm tóm tắt, chi tiết, số sao và ngày tạo.
mongoose cho phép bạn tạo các lược đồ tham chiếu đến các lược đồ khác hoặc trong ví dụ ở trên với thuộc tính xếp hạng, nó cho phép bạn tạo một mảng các thuộc tính phụ có thể được đưa vào lược đồ liên quan. (ví dụ: sách cho tác giả) hoặc nội dòng như trong ví dụ trên (sử dụng sách cho một mảng xếp hạng).
Tạo và lưu mô hình mongoose
Vì các mẫu tác giả và sách chứng minh tính linh hoạt của Mongoose, tôi sẽ tiếp tục sử dụng các mẫu này và lấy các mẫu tác giả và sách từ chúng.
Một mô hình mongoose, khi được lưu, sẽ tạo một tài liệu trong mongodb với các thuộc tính được xác định trong lược đồ mà nó bắt nguồn từ đó.
Để minh họa việc tạo và lưu các đối tượng, trong ví dụ tiếp theo, tôi sẽ tạo một số đối tượng: một mô hình tác giả và một số mô hình sách. Sau khi được tạo, các đối tượng này sẽ được lưu vào mongodb bằng phương thức lưu của mô hình.
Trong ví dụ trên, tôi vô tình trích dẫn hai cuốn sách gần đây nhất của tôi. Ví dụ đầu tiên tạo và lưu jamieobject được tạo từ mô hình tác giả. Trong chức năng lưu của jamieobject, ứng dụng sẽ ném ra một ngoại lệ nếu xảy ra lỗi. Sau khi lưu thành công, bên trong chức năng lưu, hai đối tượng sách sẽ được tạo và lưu. Tương tự như jamieobject, nếu có lỗi lưu, lỗi sẽ được xuất ra, ngược lại, thông báo thành công sẽ được xuất ra bảng điều khiển.
Để tạo tham chiếu đến tác giả, đối tượng sách cũng chỉ định tham chiếu đến khóa chính _id của tác giả giản đồ trong thuộc tính tác giả của sách lược đồ.
Xác thực dữ liệu trước khi lưu
Rất phổ biến để tạo dữ liệu cho các mô hình được nhập bởi các biểu mẫu trên các trang web. Vì vậy, bạn nên xác thực dữ liệu này trước khi lưu mô hình vào mongodb.
Trong ví dụ tiếp theo, tôi đã cập nhật giản đồ tác giả trước đó để thêm xác thực vào các thuộc tính sau: tên, twitter, facebook và linkedin.
Thuộc tính
firstname đã được gán cho thuộc tính mong muốn. Bây giờ khi tôi gọi hàm lưu, mongoose trả về lỗi nói rằng thuộc tính tên là bắt buộc. Tôi chọn không đặt thuộc tính họ nếu cher hoặc madonna là tác giả trong cơ sở dữ liệu của tôi.
Các thuộc tính
twitter, facebook và linkedin đều có các trình xác thực tùy chỉnh rất giống nhau được áp dụng. Họ đảm bảo rằng giá trị bắt đầu bằng miền tương ứng của mạng xã hội. Các trường này không bắt buộc, vì vậy trình xác thực sẽ chỉ được áp dụng nếu dữ liệu được cung cấp cho thuộc tính.
Tìm kiếm và cập nhật dữ liệu
Phần giới thiệu về Mongoose sẽ không hoàn chỉnh nếu không có ví dụ về việc ghi và cập nhật một hoặc nhiều thuộc tính của đối tượng đó.
mongoose cung cấp nhiều chức năng khác nhau để tìm dữ liệu cho một mô hình cụ thể. các chức năng find, findone và findbyid.
Cả hai hàm find và findone đều chấp nhận một đối tượng làm đầu vào, cho phép các tìm kiếm phức tạp, trong khi findbyid chỉ chấp nhận một giá trị có hàm gọi lại (một ví dụ sẽ được đưa ra sau). Trong ví dụ tiếp theo, tôi sẽ trình bày cách tìm tất cả các sách có chuỗi “mvc” trong tiêu đề.
Trong hàm find, tôi tìm chuỗi không phân biệt chữ hoa chữ thường “mvc” trong thuộc tính title. Điều này được thực hiện bằng cách sử dụng cú pháp tương tự như sử dụng javascript để tìm chuỗi.
Gọi tìm kiếm cũng được kết hợp với các phương thức truy vấn khác như ở đâu, và hoặc, giới hạn, sắp xếp, bất kỳ, v.v.
Hãy mở rộng ví dụ trước để giới hạn kết quả trong năm cuốn sách đầu tiên, được sắp xếp theo ngày tạo theo thứ tự giảm dần. Nó sẽ trả về tối đa năm cuốn sách gần đây nhất có “mvc” trong tiêu đề.
Khi hàm find được áp dụng, thứ tự của các hàm khác không quan trọng vì tất cả các hàm có phép nối được biên dịch thành một truy vấn và không được thực thi cho đến khi hàm thực thi được gọi.
Như tôi đã đề cập trước đó, hàm findbyid được triển khai hơi khác một chút. Hàm này thực thi ngay lập tức và chấp nhận một hàm gọi lại thay vì cho phép chuỗi hàm. Trong ví dụ tiếp theo, tôi đang truy vấn tác giả cụ thể bằng _id.
_id có thể hơi khác trong trường hợp của bạn. Tôi đã sao chép _id này từ console.log trước đó khi tìm danh sách sách có “mvc” trong tiêu đề.
Sau khi đối tượng được trả về, bạn có thể sửa đổi bất kỳ thuộc tính nào của đối tượng để cập nhật nó. Sau khi thực hiện các thay đổi cần thiết, hãy gọi phương thức lưu như thể bạn đang tạo một đối tượng. Trong ví dụ tiếp theo, tôi sẽ mở rộng ví dụ findbyid và cập nhật thuộc tính linkedin của tác giả.
Sau khi truy xuất thành công tác giả, hãy đặt thuộc tính linkedin và gọi hàm lưu. mongoose có thể phát hiện ra rằng thuộc tính linkedin đã bị thay đổi và nó sẽ gửi thông báo cập nhật đến mongodb chỉ đối với thuộc tính đã sửa đổi. Nếu xảy ra lỗi trong khi lưu, một ngoại lệ sẽ được đưa ra và ứng dụng sẽ dừng lại. Khi thành công, bảng điều khiển ghi lại một thông báo thành công.
mongoose cũng cung cấp hai hàm bổ sung để tìm và lưu đối tượng cùng một lúc, với các hàm được đặt tên thích hợp: findbyidandupdate và findoneandupdate. Vui lòng nâng cấp ví dụ trước để sử dụng findbyidandupdate.
Trong ví dụ trước, thuộc tính cần cập nhật được cung cấp dưới dạng đối tượng dưới dạng tham số thứ hai của hàm findbyidandupdate. Hàm gọi lại bây giờ là tham số thứ ba. Sau khi cập nhật thành công, đối tượng tác giả chứa thông tin cập nhật sẽ được trả về. Điều này ghi vào bảng điều khiển để xem thuộc tính tác giả được cập nhật.
Sau tất cả, ví dụ về mã
Trong suốt bài viết này, tôi cung cấp các đoạn mã nhỏ xác định một hoạt động rất cụ thể, chẳng hạn như tạo lược đồ, tạo mô hình, v.v. Hãy đặt chúng lại với nhau trong một ví dụ hoàn chỉnh.
Đầu tiên, tôi đã tạo hai tệp bổ sung: authorr.js và book.js. Các tệp này chứa các định nghĩa lược đồ và tạo mô hình tương ứng của chúng. Dòng mã cuối cùng làm cho mô hình sẵn sàng để sử dụng trong index.js.
Hãy bắt đầu với tác giả.js:
Tiếp theo là book.js:
Cuối cùng, hãy cập nhật tệp index.js:
Trong ví dụ trên, tất cả các hoạt động mongoose được chứa trong hàm kết nối. Các tệp tác giả và sách được bao gồm trong hàm request sau khi liên kết với thư viện mongoose.
Với mongodb đang chạy, giờ đây bạn có thể hoàn thành một ứng dụng node.js đầy đủ với:
Sau khi tôi lưu một số dữ liệu vào cơ sở dữ liệu của mình, tôi đã cập nhật tệp index.js bằng cách sử dụng hàm tìm như sau:
Một lần nữa, bạn có thể chạy ứng dụng với: node index.js.
Tóm tắt
Sau khi đọc bài viết này, bạn sẽ có thể tạo các mô hình và lược đồ cực kỳ linh hoạt cho mongose, áp dụng xác thực đơn giản hoặc phức tạp, tạo và cập nhật tài liệu và cuối cùng là tìm kiếm tài liệu đã tạo.
Hy vọng rằng bây giờ bạn có thể dễ dàng sử dụng mongoose. Nếu bạn đang tìm kiếm thêm thông tin, tôi khuyên bạn nên xem hướng dẫn mongoose, hướng dẫn này đi sâu vào các chủ đề nâng cao như dân số, phần mềm trung gian, lời hứa và hơn thế nữa.
Chúc bạn đi săn vui vẻ (tham khảo động vật meerkat tội nghiệp)!