Tại sao lại sử dụng mongodb tại sao nó thường được sử dụng với nút js?

Chúng ta sẽ xem cách Xác thực lược đồ MongoDB giúp chúng ta thực thi một lược đồ cơ sở dữ liệu, trong khi vẫn cho phép tính linh hoạt cao khi cần. Cuối cùng, chúng tôi sẽ xem liệu các tính năng bổ sung mà Mongoose cung cấp có xứng đáng với chi phí giới thiệu thư viện của bên thứ ba vào ứng dụng của chúng tôi hay không

Mongoose là một nút. thư viện Mô hình hóa dữ liệu đối tượng (ODM) dựa trên js cho MongoDB. Nó gần giống với Trình ánh xạ quan hệ đối tượng (ORM) chẳng hạn như SQLAlchemy cho cơ sở dữ liệu SQL truyền thống. Vấn đề mà Mongoose muốn giải quyết là cho phép các nhà phát triển thực thi một lược đồ cụ thể ở lớp ứng dụng. Ngoài việc thực thi lược đồ, Mongoose còn cung cấp nhiều hook, xác thực mô hình và các tính năng khác nhằm giúp làm việc với MongoDB dễ dàng hơn

Xác thực lược đồ MongoDB là gì?

Xác thực lược đồ MongoDB giúp dễ dàng thực thi một lược đồ đối với cơ sở dữ liệu MongoDB của bạn, đồng thời duy trì mức độ linh hoạt cao, mang lại cho bạn cả hai thế giới tốt nhất. Trước đây, cách duy nhất để thực thi lược đồ đối với bộ sưu tập MongoDB là thực hiện ở cấp ứng dụng bằng ODM như Mongoose, nhưng điều đó đặt ra những thách thức đáng kể cho các nhà phát triển

Nếu bạn muốn làm theo hướng dẫn này và khám phá các xác thực lược đồ nhưng chưa thiết lập phiên bản MongoDB, bạn có thể thiết lập cụm MongoDB Atlas miễn phí tại đây

Mô hình hóa dữ liệu đối tượng trong MongoDB

Một lợi ích to lớn của việc sử dụng cơ sở dữ liệu NoSQL như MongoDB là bạn không bị ràng buộc vào một mô hình dữ liệu cứng nhắc. Bạn có thể thêm hoặc xóa các trường, lồng dữ liệu sâu vào nhiều lớp và có một mô hình dữ liệu thực sự linh hoạt đáp ứng nhu cầu của bạn hôm nay và có thể thích ứng với nhu cầu luôn thay đổi của bạn vào ngày mai. Nhưng quá linh hoạt cũng có thể là một thách thức. Nếu không có sự đồng thuận về mô hình dữ liệu sẽ trông như thế nào và mọi tài liệu trong bộ sưu tập chứa rất nhiều trường khác nhau, thì bạn sẽ có một khoảng thời gian tồi tệ

Lược đồ và mô hình Mongoose

Ở một đầu của quang phổ, chúng tôi có ODM giống như Mongoose, ngay từ đầu đã buộc chúng tôi vào một lược đồ nửa cứng nhắc. Với Mongoose, bạn sẽ xác định một đối tượng Schema trong mã ứng dụng của mình để ánh xạ tới một bộ sưu tập trong cơ sở dữ liệu MongoDB của bạn. Đối tượng Schema xác định cấu trúc của tài liệu trong bộ sưu tập của bạn. Sau đó, bạn cần tạo một đối tượng Model ngoài lược đồ. Mô hình được sử dụng để tương tác với bộ sưu tập

Ví dụ: giả sử chúng tôi đang xây dựng một blog và muốn đại diện cho một bài đăng trên blog. Trước tiên, chúng tôi sẽ xác định một lược đồ và sau đó tạo một mô hình Mongoose đi kèm

Thực thi các thao tác trên MongoDB với Mongoose

Khi chúng tôi đã xác định mô hình Mongoose, chúng tôi có thể chạy các truy vấn để tìm nạp, cập nhật và xóa dữ liệu đối với bộ sưu tập MongoDB phù hợp với mô hình Mongoose. Với mô hình trên, chúng ta có thể làm những việc như

Nút Mongoose so với MongoDB. trình điều khiển js. Một sự so sanh

Lợi ích của việc sử dụng Mongoose là chúng tôi có một lược đồ để hoạt động trong mã ứng dụng của chúng tôi và mối quan hệ rõ ràng giữa các tài liệu MongoDB của chúng tôi và các mô hình Mongoose trong ứng dụng của chúng tôi. Nhược điểm là chúng tôi chỉ có thể tạo các bài đăng trên blog và chúng phải tuân theo lược đồ đã xác định ở trên. Nếu chúng tôi thay đổi lược đồ Mongoose của mình, chúng tôi sẽ thay đổi hoàn toàn mối quan hệ và nếu bạn đang trải qua quá trình phát triển nhanh chóng, điều này có thể làm bạn chậm lại rất nhiều

Nhược điểm khác là mối quan hệ này giữa lược đồ và mô hình chỉ tồn tại trong giới hạn của Nút của chúng tôi. ứng dụng js. Cơ sở dữ liệu MongoDB của chúng tôi không biết về mối quan hệ, nó chỉ chèn hoặc truy xuất dữ liệu được yêu cầu mà không có bất kỳ hình thức xác thực nào. Trong trường hợp chúng tôi sử dụng một ngôn ngữ lập trình khác để tương tác với cơ sở dữ liệu của mình, tất cả các ràng buộc và mô hình mà chúng tôi đã xác định trong Mongoose sẽ vô giá trị

Mặt khác, nếu chúng tôi quyết định chỉ sử dụng Nút MongoDB. js, chúng tôi có thể chạy truy vấn đối với bất kỳ bộ sưu tập nào trong cơ sở dữ liệu của mình hoặc tạo bộ sưu tập mới một cách nhanh chóng. Nút MongoDB. trình điều khiển js không có khái niệm về mô hình hóa hoặc ánh xạ dữ liệu đối tượng

Chúng tôi chỉ cần viết các truy vấn đối với cơ sở dữ liệu và bộ sưu tập mà chúng tôi muốn hợp tác để hoàn thành các mục tiêu kinh doanh. Nếu chúng tôi muốn chèn một bài đăng blog mới vào bộ sưu tập của mình, chúng tôi chỉ cần thực hiện một lệnh như vậy

Thao tác insertOne() này sẽ chạy tốt khi sử dụng Nút. trình điều khiển js. Nếu chúng tôi cố gắng lưu dữ liệu này bằng mô hình Mongoose Blog, nó sẽ thất bại vì chúng tôi không có thuộc tính author được xác định trong mô hình Blog Mongoose của chúng tôi

Chỉ vì nút. js không có khái niệm về mô hình, không có nghĩa là chúng tôi không thể tạo mô hình để biểu thị dữ liệu MongoDB của mình ở cấp ứng dụng. Chúng ta có thể dễ dàng tạo một mô hình chung hoặc sử dụng một thư viện như objectmodel. Chúng ta có thể tạo một mô hình Blog như vậy

Sau đó, chúng tôi có thể sử dụng mô hình này cùng với Nút MongoDB của chúng tôi. js, mang lại cho chúng ta sự linh hoạt khi sử dụng mô hình, nhưng không bị hạn chế bởi nó

Trong trường hợp này, cơ sở dữ liệu MongoDB của chúng tôi vẫn chưa biết về mô hình Blog của chúng tôi ở cấp ứng dụng, nhưng các nhà phát triển của chúng tôi có thể làm việc với nó, thêm các phương thức và trình trợ giúp cụ thể vào mô hình và sẽ biết rằng mô hình này chỉ được sử dụng trong . ứng dụng js. Tiếp theo, hãy khám phá xác thực giản đồ

Chúng tôi có thể chọn giữa hai cách khác nhau để thêm xác thực lược đồ vào bộ sưu tập MongoDB của mình. Đầu tiên là sử dụng trình xác thực cấp ứng dụng, được xác định trong lược đồ Mongoose. Thứ hai là sử dụng xác thực lược đồ MongoDB, được xác định trong chính bộ sưu tập MongoDB. Sự khác biệt lớn là việc xác thực lược đồ MongoDB gốc được áp dụng ở cấp cơ sở dữ liệu. Hãy xem tại sao điều đó lại quan trọng bằng cách khám phá cả hai phương pháp

Xác thực lược đồ với Mongoose

Khi nói đến xác thực lược đồ, Mongoose thực thi nó ở lớp ứng dụng như chúng ta đã thấy trong phần trước. Nó làm điều này theo hai cách

Đầu tiên, bằng cách xác định mô hình của chúng tôi, chúng tôi đang nói rõ ràng với Node của chúng tôi. js, những trường và loại dữ liệu nào chúng tôi sẽ cho phép chèn vào một bộ sưu tập cụ thể. Ví dụ: lược đồ Blog Mongoose của chúng tôi xác định thuộc tính title thuộc loại String. Nếu chúng tôi cố gắng chèn một bài đăng blog với thuộc tính title là một mảng, nó sẽ thất bại. Mọi thứ bên ngoài các trường đã xác định, cũng sẽ không được chèn vào cơ sở dữ liệu

Thứ hai, chúng tôi xác thực thêm rằng dữ liệu trong các trường đã xác định khớp với bộ tiêu chí đã xác định của chúng tôi. Ví dụ: chúng tôi có thể mở rộng mô hình Blog của mình bằng cách thêm các trình xác thực cụ thể, chẳng hạn như yêu cầu một số trường nhất định, đảm bảo độ dài tối thiểu hoặc tối đa cho một trường cụ thể hoặc thậm chí đưa ra logic tùy chỉnh của chúng tôi. Hãy xem nó trông như thế nào với Mongoose. Trong mã của chúng tôi, chúng tôi chỉ cần mở rộng thuộc tính và thêm trình xác nhận của chúng tôi

Mongoose xử lý định nghĩa mô hình và xác thực lược đồ trong một cú trượt ngã. Nhược điểm vẫn vậy. Các quy tắc này chỉ áp dụng ở lớp ứng dụng và bản thân MongoDB không phải là điều khôn ngoan hơn

Nút MongoDB. bản thân trình điều khiển js không có cơ chế chèn hoặc quản lý xác thực và nó không nên. Chúng ta có thể xác định các quy tắc xác thực lược đồ cho cơ sở dữ liệu MongoDB của mình bằng cách sử dụng hoặc Compass

Chúng tôi có thể tạo xác thực lược đồ khi tạo bộ sưu tập của mình hoặc sau khi thực tế trên bộ sưu tập hiện có. Vì chúng tôi đã làm việc với ý tưởng blog này làm ví dụ của chúng tôi, chúng tôi sẽ thêm các xác thực lược đồ của chúng tôi vào đó. Tôi sẽ sử dụng Compass và MongoDB Atlas. Để có tài nguyên tuyệt vời về cách thêm xác thực lược đồ theo chương trình, hãy xem loạt bài này

Nếu bạn muốn làm theo hướng dẫn này và khám phá các xác thực lược đồ nhưng chưa thiết lập phiên bản MongoDB, bạn có thể thiết lập cụm MongoDB Atlas miễn phí tại đây

Tạo một bộ sưu tập có tên là Schema0 và hãy chèn hai tài liệu mà chúng ta đang làm việc với. Các tài liệu là

Bây giờ, trong Giao diện người dùng la bàn, tôi sẽ điều hướng đến tab Xác thực. Như mong đợi, hiện tại không có quy tắc xác thực nào, nghĩa là cơ sở dữ liệu của chúng tôi sẽ chấp nhận bất kỳ tài liệu nào miễn là nó hợp lệ BSON. Nhấn nút Thêm quy tắc và bạn sẽ thấy giao diện người dùng để tạo quy tắc xác thực của riêng mình

Theo mặc định, không có quy tắc nào, vì vậy mọi tài liệu sẽ được đánh dấu là đạt. Hãy thêm một quy tắc để yêu cầu thuộc tính author. Nó sẽ trông giống thế này

Bây giờ chúng ta sẽ thấy rằng bài đăng đầu tiên của chúng tôi, bài đăng không có trường author đã không xác thực được, trong khi bài đăng có trường author thì tốt

Chúng tôi cũng có thể tiến xa hơn và thêm xác thực vào các trường riêng lẻ. Giả sử vì mục đích SEO, chúng tôi muốn tất cả các tiêu đề của bài đăng trên blog có tối thiểu 20 ký tự và có độ dài tối đa là 80 ký tự. Chúng ta có thể đại diện cho điều đó như thế này

Bây giờ nếu chúng tôi cố gắng chèn một tài liệu vào bộ sưu tập Schema0 của mình thông qua Nút. js hoặc qua Compass, chúng tôi sẽ gặp lỗi

Có nhiều quy tắc và xác thực khác mà bạn có thể thêm. Kiểm tra danh sách đầy đủ. Để có cách tiếp cận được hướng dẫn nâng cao hơn, hãy xem các bài viết về xác thực lược đồ với mảng và phần phụ thuộc

Mở rộng về xác thực lược đồ

Với Mongoose, mô hình dữ liệu và lược đồ của chúng tôi là cơ sở cho các tương tác của chúng tôi với MongoDB. Bản thân MongoDB không nhận thức được bất kỳ ràng buộc nào trong số này, Mongoose đóng vai trò là thẩm phán, bồi thẩm đoàn và người thi hành án về những truy vấn nào có thể được thực thi và điều gì xảy ra với chúng

Nhưng với xác thực lược đồ gốc MongoDB, chúng tôi có thêm tính linh hoạt. Khi chúng tôi triển khai lược đồ, việc xác thực trên các tài liệu hiện có không tự động xảy ra. Việc xác thực chỉ được thực hiện trên các bản cập nhật và phụ trang. Tuy nhiên, nếu chúng tôi muốn để nguyên các tài liệu hiện có, chúng tôi có thể thay đổi Schema5 để chỉ xác thực các tài liệu mới được chèn vào cơ sở dữ liệu

Ngoài ra, với việc xác thực lược đồ được thực hiện ở cấp cơ sở dữ liệu MongoDB, chúng tôi có thể chọn vẫn chèn tài liệu không xác thực. Tùy chọn Schema6 cho phép chúng tôi xác định điều gì sẽ xảy ra nếu một truy vấn không xác thực được. Theo mặc định, nó được đặt thành Schema7, nhưng chúng tôi có thể thay đổi nó thành Schema8 nếu chúng tôi muốn chèn vẫn xảy ra. Bây giờ thay vì lỗi chèn hoặc cập nhật, nó sẽ chỉ cảnh báo người dùng rằng thao tác không xác thực được

Và cuối cùng, nếu cần, chúng tôi có thể bỏ qua xác thực tài liệu hoàn toàn bằng cách chuyển tùy chọn Schema9 với truy vấn của chúng tôi. Để cho bạn thấy điều này hoạt động như thế nào, giả sử chúng tôi chỉ muốn chèn một title vào bộ sưu tập Schema0 của mình và chúng tôi không muốn bất kỳ dữ liệu nào khác. Nếu chúng ta cố gắng làm điều này

chúng tôi sẽ gặp lỗi nói rằng việc xác thực tài liệu không thành công. Nhưng nếu chúng tôi muốn bỏ qua xác thực tài liệu cho phụ trang này, chúng tôi chỉ cần làm điều này

Điều này sẽ không thể thực hiện được với Mongoose. Xác thực lược đồ MongoDB phù hợp hơn với toàn bộ triết lý của MongoDB, trong đó trọng tâm là lược đồ thiết kế linh hoạt, có thể thích ứng nhanh chóng và dễ dàng với các trường hợp sử dụng của bạn

Khu vực cuối cùng mà tôi muốn so sánh Mongoose và Node. js Trình điều khiển MongoDB là hỗ trợ cho giả tham gia. Cả Mongoose và Node gốc. js hỗ trợ khả năng kết hợp tài liệu từ nhiều bộ sưu tập trong cùng một cơ sở dữ liệu, tương tự như tham gia trong cơ sở dữ liệu quan hệ truyền thống

Cách tiếp cận Mongoose được gọi là Dân cư. Nó cho phép các nhà phát triển tạo các mô hình dữ liệu có thể tham chiếu lẫn nhau và sau đó, với một API đơn giản, yêu cầu dữ liệu từ nhiều bộ sưu tập. Ví dụ của chúng tôi, hãy mở rộng bài đăng trên blog và thêm bộ sưu tập mới cho người dùng

Những gì chúng tôi đã làm ở trên là chúng tôi đã tạo một mô hình và lược đồ mới để đại diện cho những người dùng để lại nhận xét trên các bài đăng trên blog. Khi người dùng để lại nhận xét, thay vì lưu trữ thông tin về họ, chúng tôi sẽ chỉ lưu trữ Model2 của người dùng đó. Vì vậy, thao tác cập nhật để thêm nhận xét mới vào bài đăng của chúng ta có thể giống như thế này

Điều này giả định rằng chúng tôi có một người dùng trong bộ sưu tập Model3 của chúng tôi với Model2 của Model5. Bây giờ, nếu chúng ta muốn điền vào thuộc tính Model6 của mình khi chúng ta thực hiện một truy vấn—và thay vì chỉ trả về Model2, hãy trả lại toàn bộ tài liệu—chúng ta có thể thực hiện

Dân số kết hợp với mô hình hóa dữ liệu Mongoose có thể rất mạnh mẽ, đặc biệt nếu bạn đến từ nền tảng cơ sở dữ liệu quan hệ. Tuy nhiên, nhược điểm là lượng ma thuật diễn ra dưới mui xe để thực hiện điều này. Mongoose sẽ thực hiện hai truy vấn riêng biệt để hoàn thành tác vụ này và nếu bạn đang tham gia nhiều bộ sưu tập, các thao tác có thể nhanh chóng bị chậm lại

Vấn đề khác là khái niệm dân cư chỉ tồn tại ở lớp ứng dụng. Vì vậy, trong khi điều này hoạt động, việc dựa vào nó để quản lý cơ sở dữ liệu của bạn có thể quay lại cắn bạn trong tương lai

MongoDB kể từ phiên bản 3. 2 đã giới thiệu một thao tác mới có tên là Model8 cho phép các nhà phát triển về cơ bản thực hiện phép nối ngoài bên trái trên các bộ sưu tập trong một cơ sở dữ liệu MongoDB duy nhất. Nếu chúng tôi muốn điền thông tin người dùng bằng nút. js, chúng ta có thể tạo một đường dẫn tổng hợp để làm điều đó. Điểm xuất phát của chúng ta khi sử dụng toán tử Model8 có thể trông như thế này

Chúng tôi có thể tạo thêm một bước bổ sung trong quy trình tổng hợp của mình để thay thế thông tin người dùng trong trường insertOne()0 bằng dữ liệu người dùng, nhưng điều đó hơi nằm ngoài phạm vi của bài viết này. Nếu bạn muốn tìm hiểu thêm về cách các quy trình tổng hợp hoạt động với MongoDB, hãy xem tài liệu tổng hợp

Suy nghĩ cuối cùng. Tôi có thực sự cần Mongoose?

Cả Mongoose và Nút MongoDB. trình điều khiển js hỗ trợ chức năng tương tự. Mặc dù Mongoose làm cho quá trình phát triển MongoDB trở nên quen thuộc với những người có thể hoàn toàn mới, nhưng nó thực hiện rất nhiều phép thuật tiềm ẩn có thể gây ra những hậu quả không lường trước được trong tương lai

Cá nhân tôi tin rằng bạn không cần ODM để thành công với MongoDB. Tôi cũng không phải là một fan hâm mộ lớn của ORM trong thế giới cơ sở dữ liệu quan hệ. Mặc dù họ làm cho bước đầu tìm hiểu công nghệ trở nên quen thuộc, nhưng họ lại loại bỏ rất nhiều sức mạnh của cơ sở dữ liệu

Các nhà phát triển có rất nhiều lựa chọn để thực hiện khi xây dựng ứng dụng. Trong bài viết này, chúng tôi đã xem xét sự khác biệt giữa việc sử dụng ODM so với trình điều khiển gốc và chỉ ra rằng sự khác biệt giữa hai loại này không quá lớn. Sử dụng một ODM như Mongoose có thể khiến quá trình phát triển trở nên quen thuộc nhưng buộc bạn phải có một thiết kế cứng nhắc, đây là một phản mẫu khi xem xét việc xây dựng với MongoDB

Nút MongoDB. js hoạt động tự nhiên với cơ sở dữ liệu MongoDB của bạn để cung cấp cho bạn trải nghiệm phát triển tốt nhất và linh hoạt nhất. Nó cho phép cơ sở dữ liệu làm những gì tốt nhất trong khi cho phép ứng dụng của bạn tập trung vào những gì nó giỏi nhất và đó có thể không phải là quản lý các mô hình dữ liệu

Tại sao MongoDB lại phổ biến với NodeJS?

Thông thường mọi người thích mongoDB hơn vì những lý do sau. Hệ thống quản lý cơ sở dữ liệu NoSQL linh hoạt hơn RDBMS . Chi phí duy trì và thậm chí thiết lập RDBMS tương đối cao.

Khi nào nên sử dụng nút js và khi nào nên sử dụng MongoDB?

MongoDB và NodeJS là hai công nghệ khác nhau. MonogDB là một hệ thống cơ sở dữ liệu cung cấp cho bạn cơ hội lưu trữ tài liệu trong cơ sở dữ liệu một cách hiệu quả và thực hiện các thao tác như cập nhật dữ liệu hoặc tìm kiếm tài liệu theo một số tiêu chí . Trách nhiệm của NodeJS đặc biệt là thực thi ứng dụng của bạn. Lưu câu trả lời này.

Nút js có tốt cho MongoDB không?

Tùy thuộc vào ứng dụng của bạn, Nút kết hợp. js và MongoDB hầu hết thời gian hoạt động tốt — đặc biệt nếu bạn sử dụng khung giao diện người dùng như React (MERN), Angular (MEAN) hoặc Vue . Trong hướng dẫn này, bạn sẽ học cách tạo ứng dụng CRUD bằng Node.

Tại sao MongoDB được sử dụng rộng rãi?

MongoDB đã trở thành một trong những cơ sở dữ liệu được mong muốn nhất trên thế giới vì nó giúp các nhà phát triển dễ dàng lưu trữ, quản lý và truy xuất dữ liệu khi tạo ứng dụng bằng hầu hết các ngôn ngữ lập trình.