Mô hình MongoDB Nodejs

NoSQL mang lại tính linh hoạt cho thế giới cơ sở dữ liệu dạng bảng. MongoDB nói riêng đã trở thành một lựa chọn tuyệt vời để lưu trữ các tài liệu JSON phi cấu trúc. Dữ liệu bắt đầu dưới dạng JSON trong giao diện người dùng và trải qua rất ít lần chuyển đổi để được lưu trữ, vì vậy chúng tôi nhận được lợi ích từ việc tăng hiệu suất và giảm thời gian xử lý

Nhưng NoSQL không có nghĩa là hoàn toàn thiếu cấu trúc. Chúng tôi vẫn cần xác thực và truyền dữ liệu của mình trước khi lưu trữ và chúng tôi vẫn có thể cần áp dụng một số logic nghiệp vụ cho dữ liệu đó. Đó là nơi Mongoose lấp đầy

Trong bài viết này, chúng ta sẽ tìm hiểu thông qua một ứng dụng ví dụ về cách chúng ta có thể sử dụng Mongoose để lập mô hình dữ liệu của mình và xác thực dữ liệu đó trước khi lưu trữ vào MongoDB

Chúng tôi sẽ viết mô hình cho ứng dụng Phả hệ, một Người có một vài thuộc tính cá nhân, bao gồm cả cha mẹ của họ là ai. Chúng ta cũng sẽ xem cách chúng ta có thể sử dụng mô hình này để tạo và sửa đổi Người và lưu họ vào MongoDB

Mongoose là gì?

MongoDB hoạt động như thế nào

Để hiểu Mongoose là gì, trước tiên chúng ta cần hiểu một cách khái quát về cách thức hoạt động của MongoDB. Đơn vị dữ liệu cơ bản mà chúng ta có thể lưu trong MongoDB là Tài liệu. Mặc dù được lưu trữ dưới dạng nhị phân, nhưng khi chúng tôi truy vấn cơ sở dữ liệu, chúng tôi sẽ nhận được biểu diễn của nó dưới dạng đối tượng JSON

Các tài liệu liên quan có thể được lưu trữ trong các bộ sưu tập, tương tự như các bảng trong cơ sở dữ liệu quan hệ. Tuy nhiên, đây là lúc phép loại suy kết thúc, bởi vì chúng tôi xác định những gì cần xem xét là "tài liệu liên quan"

MongoDB sẽ không thực thi cấu trúc trên tài liệu. Ví dụ: chúng tôi có thể lưu tài liệu này vào bộ sưu tập

$ npm init -y
6

{
  "name": "Alice"
}

Và sau đó trong cùng một bộ sưu tập, chúng tôi có thể lưu một tài liệu dường như không liên quan mà không có thuộc tính hoặc cấu trúc được chia sẻ

{
  "latitude": 53.3498,
  "longitude": 6.2603
}

Đây là tính mới của cơ sở dữ liệu NoSQL. Chúng tôi tạo ra ý nghĩa cho dữ liệu của mình và lưu trữ nó theo cách mà chúng tôi cho là tốt nhất. Cơ sở dữ liệu sẽ không áp đặt bất kỳ giới hạn nào

Mongoose Mục đích

Mặc dù MongoDB sẽ không áp đặt cấu trúc, nhưng các ứng dụng thường quản lý dữ liệu bằng một. Chúng tôi nhận được dữ liệu và cần xác thực dữ liệu đó để đảm bảo những gì chúng tôi nhận được là những gì chúng tôi cần. Chúng tôi cũng có thể cần xử lý dữ liệu theo cách nào đó trước khi lưu dữ liệu. Đây là nơi Mongoose phát huy tác dụng

Mongoose là một gói NPM cho các ứng dụng NodeJS. Nó cho phép xác định các lược đồ để phù hợp với dữ liệu của chúng ta, đồng thời trừu tượng hóa quyền truy cập vào MongoDB. Bằng cách này, chúng tôi có thể đảm bảo tất cả các tài liệu đã lưu đều có chung cấu trúc và chứa các thuộc tính cần thiết

Bây giờ hãy xem cách xác định một lược đồ

Cài đặt Mongoose và tạo Person Schema

Hãy bắt đầu một dự án Node với các thuộc tính mặc định và lược đồ người

$ npm init -y

Với dự án đã được khởi tạo, hãy tiếp tục và cài đặt

$ npm init -y
7 bằng cách sử dụng
$ npm init -y
8

$ npm install --save mongoose

$ npm init -y
7 cũng sẽ tự động bao gồm mô-đun NPM
$ npm install --save mongoose
0. Bạn sẽ không sử dụng nó trực tiếp cho mình. Nó sẽ được xử lý bởi Mongoose

Để làm việc với Mongoose, chúng tôi sẽ muốn nhập nó vào tập lệnh của mình

let mongoose = require('mongoose');

Và sau đó kết nối với cơ sở dữ liệu với

{
  "name": "Alice"
}
0

Vì cơ sở dữ liệu chưa tồn tại, một cơ sở dữ liệu sẽ được tạo. Chúng tôi sẽ sử dụng công cụ mới nhất để phân tích cú pháp chuỗi kết nối, bằng cách đặt

$ npm install --save mongoose
1 thành
$ npm install --save mongoose
2 và chúng tôi cũng sẽ sử dụng trình điều khiển MongoDB mới nhất với
$ npm install --save mongoose
3 là
$ npm install --save mongoose
2

$ npm install --save mongoose
5 giả sử máy chủ MongoDB đang chạy cục bộ trên cổng mặc định và không có thông tin xác thực. Một cách dễ dàng để MongoDB chạy theo cách đó là Docker

{
  "name": "Alice"
}
6

Vùng chứa được tạo sẽ đủ để chúng tôi dùng thử Mongoose, mặc dù dữ liệu được lưu vào MongoDB sẽ không liên tục

Sơ đồ người và mô hình

Sau những giải thích cần thiết trước đó, bây giờ chúng ta có thể tập trung vào việc viết lược đồ người của mình và biên dịch một mô hình từ đó

Một lược đồ trong Mongoose ánh xạ tới bộ sưu tập MongoDB và xác định định dạng cho tất cả các tài liệu trên bộ sưu tập đó. Tất cả các thuộc tính bên trong lược đồ phải được gán một

$ npm install --save mongoose
6. Ví dụ: tên của
$ npm init -y
6 của chúng tôi có thể được định nghĩa theo cách này

{
  "name": "Alice"
}
9

Hoặc thậm chí đơn giản hơn, như thế này

{
  "latitude": 53.3498,
  "longitude": 6.2603
}
0

$ npm install --save mongoose
8 là một trong số
$ npm install --save mongoose
9 được định nghĩa bởi Mongoose. Bạn có thể tìm thấy phần còn lại trong

Tham chiếu đến các lược đồ khác

Chúng ta có thể mong đợi rằng tất cả các ứng dụng có kích thước trung bình sẽ có nhiều hơn một lược đồ và có thể những lược đồ đó sẽ được liên kết theo một cách nào đó

Trong ví dụ của chúng tôi, để đại diện cho cây gia đình, chúng tôi cần thêm hai thuộc tính vào lược đồ của mình

Một người có thể có một

let mongoose = require('mongoose');
0 và một
let mongoose = require('mongoose');
1. Cách thể hiện điều này trong Mongoose là lưu ID của tài liệu được tham chiếu,
let mongoose = require('mongoose');
2, chứ không phải chính đối tượng đó

Thuộc tính

let mongoose = require('mongoose');
3 phải là tên của mô hình mà chúng tôi đang tham chiếu. Chúng ta sẽ xem thêm về các mô hình sau, nhưng bây giờ là đủ để biết một lược đồ chỉ liên quan đến một mô hình và
let mongoose = require('mongoose');
4 là mô hình của
let mongoose = require('mongoose');
5

Trường hợp của chúng ta hơi đặc biệt vì cả

let mongoose = require('mongoose');
0 và
let mongoose = require('mongoose');
1 đều chứa người nhưng cách xác định các quan hệ này là giống nhau trong mọi trường hợp

Xác thực tích hợp

Tất cả các

$ npm install --save mongoose
6 đều có xác thực tích hợp sẵn mặc định. Chúng tôi có thể xác định giới hạn và các yêu cầu khác tùy thuộc vào
$ npm install --save mongoose
6 đã chọn. Để xem một số ví dụ, hãy thêm ________ 100, ________ 101 và ________ 102 vào _____ 06 của chúng ta

$ npm init -y
7

Tất cả các

$ npm install --save mongoose
6 tích hợp có thể là
{
  "name": "Alice"
}
05. Trong trường hợp của chúng tôi, chúng tôi muốn tất cả mọi người ít nhất có một tên. Loại
{
  "name": "Alice"
}
06 cho phép đặt các giá trị tối thiểu và tối đa, thậm chí có thể được tính toán

Thuộc tính

{
  "name": "Alice"
}
07 sẽ khiến Mongoose tạo một chỉ mục trong cơ sở dữ liệu. Điều này tạo điều kiện cho việc thực hiện hiệu quả các truy vấn. Ở trên, chúng tôi đã xác định
{
  "name": "Alice"
}
08 và
{
  "name": "Alice"
}
00 của người đó là chỉ mục. Chúng tôi sẽ luôn tìm kiếm những người theo tên của họ

Xác thực tùy chỉnh

Các

$ npm install --save mongoose
6 tích hợp cho phép tùy chỉnh. Điều này đặc biệt hữu ích khi chúng ta có một thuộc tính chỉ có thể chứa một số giá trị nhất định. Hãy thêm thuộc tính
{
  "name": "Alice"
}
61 vào
$ npm init -y
6 của chúng tôi, một mảng URL ảnh của họ

{
  "name": "Alice"
}
61 chỉ là một mảng Chuỗi,
{
  "name": "Alice"
}
64. Điều làm cho thuộc tính này trở nên đặc biệt là chúng tôi cần xác thực tùy chỉnh để xác nhận các giá trị được thêm có định dạng của một URL internet

Hàm

{
  "name": "Alice"
}
65 ở trên sử dụng một biểu thức chính quy phù hợp với các URL internet điển hình, phải bắt đầu bằng
{
  "name": "Alice"
}
66

Nếu chúng ta cần một

$ npm install --save mongoose
6 phức tạp hơn, chúng ta có thể tạo một cái của riêng mình, nhưng chúng ta nên tìm kiếm nếu nó đã có sẵn

Ví dụ: gói mongoose-type-url thêm một tùy chỉnh

$ npm install --save mongoose
6 mà chúng tôi có thể đã sử dụng,
{
  "name": "Alice"
}
69

Thuộc tính ảo

Ảo là thuộc tính tài liệu không được lưu vào cơ sở dữ liệu. Chúng là kết quả của một phép tính. Trong ví dụ của chúng tôi, sẽ hữu ích nếu đặt tên đầy đủ của một người trong một chuỗi thay vì tách biệt trong

{
  "name": "Alice"
}
08 và
{
  "name": "Alice"
}
00

Hãy xem cách thực hiện điều này sau định nghĩa lược đồ ban đầu của chúng tôi

Hãy xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, tiêu chuẩn được ngành chấp nhận và bao gồm bảng gian lận. Dừng các lệnh Git trên Google và thực sự tìm hiểu nó

{
  "latitude": 53.3498,
  "longitude": 6.2603
}
0

Thuộc tính ảo

{
  "name": "Alice"
}
92 ở trên đưa ra một số giả định vì mục đích đơn giản. Mỗi người đều có ít nhất một cái tên, hoặc có tên và họ. Chúng tôi sẽ gặp vấn đề nếu một người có tên đệm hoặc tên viết tắt hoặc họ. Tất cả những hạn chế đó có thể được khắc phục bên trong các hàm ________ 193 và ________ 194 được xác định ở trên

Vì ảo không được lưu vào cơ sở dữ liệu nên chúng tôi không thể sử dụng chúng làm bộ lọc khi tìm kiếm người trong cơ sở dữ liệu. Trong trường hợp của chúng tôi, chúng tôi sẽ cần sử dụng

{
  "name": "Alice"
}
08 và
{
  "name": "Alice"
}
00

Phần mềm trung gian

Phần mềm trung gian là các chức năng hoặc hook có thể được thực thi trước hoặc sau các phương thức Mongoose tiêu chuẩn, chẳng hạn như

{
  "name": "Alice"
}
97 hoặc
{
  "name": "Alice"
}
98

Một người có thể có một

let mongoose = require('mongoose');
0 và một
let mongoose = require('mongoose');
1. Như chúng tôi đã nói trước đây, chúng tôi lưu các mối quan hệ này bằng cách lưu trữ id của đối tượng dưới dạng thuộc tính của người chứ không phải bản thân đối tượng. Sẽ thật tuyệt nếu điền vào cả hai thuộc tính bằng chính các đối tượng thay vì chỉ ID

Điều này có thể đạt được dưới dạng hàm

{
  "latitude": 53.3498,
  "longitude": 6.2603
}
01 được liên kết với phương thức
{
  "latitude": 53.3498,
  "longitude": 6.2603
}
02 Mongoose

{
  "latitude": 53.3498,
  "longitude": 6.2603
}
1

Hàm trên cần gọi hàm nhận được dưới dạng tham số,

{
  "latitude": 53.3498,
  "longitude": 6.2603
}
03 để tiếp tục xử lý các hook khác

{
  "latitude": 53.3498,
  "longitude": 6.2603
}
04 là một phương pháp Mongoose để thay thế ID bằng các đối tượng mà chúng đại diện và chúng tôi sử dụng nó để lấy cha mẹ khi chỉ tìm kiếm một người

Chúng tôi có thể thêm hook này vào các chức năng tìm kiếm khác, chẳng hạn như

{
  "name": "Alice"
}
98. Chúng tôi thậm chí có thể tìm cha mẹ theo cách đệ quy nếu chúng tôi muốn. Nhưng chúng ta nên xử lý
{
  "latitude": 53.3498,
  "longitude": 6.2603
}
04 cẩn thận, vì mỗi cuộc gọi là một lần tìm nạp từ cơ sở dữ liệu

Tạo mô hình cho lược đồ

Để bắt đầu tạo tài liệu dựa trên lược đồ Person của chúng tôi, bước cuối cùng là biên dịch một mô hình dựa trên lược đồ

{
  "latitude": 53.3498,
  "longitude": 6.2603
}
2

Đối số đầu tiên sẽ là tên riêng của bộ sưu tập mà chúng ta đang đề cập đến. Đây là giá trị chúng tôi đã cung cấp cho tài sản

let mongoose = require('mongoose');
3 của tài sản
let mongoose = require('mongoose');
0 và
let mongoose = require('mongoose');
1 của người của chúng tôi. Đối số thứ hai là
$ npm init -y
70 mà chúng ta đã xác định trước đó

Phương thức

$ npm init -y
71 tạo một bản sao của tất cả những gì chúng ta đã xác định trên lược đồ. Nó cũng chứa tất cả các phương thức Mongoose mà chúng ta sẽ sử dụng để tương tác với cơ sở dữ liệu

Mô hình là thứ duy nhất chúng ta cần từ bây giờ. Chúng tôi thậm chí có thể sử dụng

$ npm init -y
72 để cung cấp người đó trong các mô-đun khác của ứng dụng của chúng tôi

{
  "latitude": 53.3498,
  "longitude": 6.2603
}
3

Chúng tôi cũng đã xuất mô-đun

$ npm init -y
7. Chúng tôi sẽ cần nó ngắt kết nối khỏi cơ sở dữ liệu trước khi ứng dụng kết thúc

Chúng ta có thể nhập mô-đun theo cách này

{
  "latitude": 53.3498,
  "longitude": 6.2603
}
4

Cách sử dụng mô hình

Mô hình chúng tôi đã biên soạn trong phần trước chứa tất cả những gì chúng tôi cần để tương tác với bộ sưu tập trên cơ sở dữ liệu

Bây giờ hãy xem cách chúng ta sẽ sử dụng mô hình của mình cho tất cả các hoạt động CRUD

tạo người

Chúng ta có thể tạo ra một người bằng cách đơn giản làm

{
  "latitude": 53.3498,
  "longitude": 6.2603
}
5

{
  "name": "Alice"
}
08 là tài sản bắt buộc duy nhất. Hãy tạo một người khác nhưng lần này sử dụng tài sản ảo

{
  "latitude": 53.3498,
  "longitude": 6.2603
}
6

Bây giờ chúng tôi có hai người đầu tiên của mình, chúng tôi có thể tạo một người mới với tất cả các thuộc tính được lấp đầy, bao gồm cả cha mẹ

{
  "latitude": 53.3498,
  "longitude": 6.2603
}
7

Tất cả các giá trị cho người cuối cùng này được đặt thành giá trị hợp lệ, vì việc xác thực sẽ gây ra lỗi ngay khi dòng này được thực thi. Ví dụ: nếu chúng tôi đã đặt URL ảnh đầu tiên thành một thứ khác không phải là liên kết, chúng tôi sẽ gặp lỗi

{
  "latitude": 53.3498,
  "longitude": 6.2603
}
8

Như đã giải thích trước đây, cha mẹ đã được hoàn thành với ID của hai người đầu tiên, thay vì các đối tượng

Chúng tôi đã tạo ba người, nhưng họ chưa được lưu trữ vào cơ sở dữ liệu. Hãy làm điều đó tiếp theo

{
  "latitude": 53.3498,
  "longitude": 6.2603
}
9

Các hoạt động liên quan đến cơ sở dữ liệu là không đồng bộ. Nếu chúng tôi muốn đợi hoàn thành, chúng tôi có thể sử dụng async/await

$ npm init -y
0

Bây giờ tất cả mọi người đã được lưu vào cơ sở dữ liệu, chúng ta có thể truy xuất lại họ bằng các phương thức

{
  "name": "Alice"
}
98 và
{
  "latitude": 53.3498,
  "longitude": 6.2603
}
02

Truy xuất một hoặc nhiều người

Tất cả các phương thức tìm kiếm trong Mongoose yêu cầu một đối số để lọc tìm kiếm. Hãy lấy lại người cuối cùng chúng ta đã tạo

$ npm init -y
1

{
  "latitude": 53.3498,
  "longitude": 6.2603
}
02 trả về một truy vấn, vì vậy để có được kết quả, chúng ta cần thực hiện nó với
$ npm init -y
78 và sau đó đợi kết quả với
$ npm init -y
79

Bởi vì chúng tôi đã gắn một cái móc vào phương pháp

{
  "latitude": 53.3498,
  "longitude": 6.2603
}
02 để điền vào cha mẹ của người đó, giờ đây chúng tôi có thể truy cập trực tiếp vào họ

$ npm init -y
2

Trong trường hợp của chúng tôi, chúng tôi biết truy vấn sẽ chỉ trả về một kết quả, nhưng ngay cả khi có nhiều người phù hợp với bộ lọc, thì chỉ kết quả đầu tiên sẽ được trả về

Chúng tôi có thể nhận được nhiều hơn một kết quả nếu chúng tôi sử dụng phương pháp

{
  "name": "Alice"
}
98

$ npm init -y
3

Chúng tôi sẽ lấy lại một mảng mà chúng tôi có thể lặp lại

Nếu chúng tôi đã có một người, vì chúng tôi vừa tạo hoặc truy xuất nó, chúng tôi có thể cập nhật và lưu các thay đổi bằng cách thực hiện

$ npm init -y
4

Vì cả hai người đã tồn tại trên cơ sở dữ liệu, Mongoose sẽ gửi lệnh cập nhật chỉ với các trường đã thay đổi chứ không phải toàn bộ tài liệu

Xóa người

Giống như truy xuất, xóa có thể được thực hiện cho một hoặc nhiều người. Hãy làm điều đó tiếp theo

$ npm init -y
5

Sau khi thực hiện hai lệnh này, bộ sưu tập sẽ trống

Phần kết luận

Trong bài viết này, chúng ta đã thấy Mongoose có thể rất hữu ích như thế nào trong các dự án NodeJS và MongoDB của chúng ta

Trong hầu hết các dự án với MongoDB, chúng tôi cần lưu trữ dữ liệu với định dạng được xác định nhất định. Thật tốt khi biết rằng Mongoose cung cấp một cách dễ dàng để lập mô hình và xác thực dữ liệu đó

Làm cách nào để tạo một mô hình trong NodeJS MongoDB?

Tạo mô hình . create a folder named Models where all Schemas will be kept. Trong thư mục Models, tạo một tệp có tên emp. js. Bên trong tệp này, tạo một lược đồ có tên empSchema và khai báo tất cả các trường bạn muốn.

Mô hình trong MongoDB là gì?

Mô hình là các hàm tạo ưa thích được biên dịch từ các định nghĩa Lược đồ . Một thể hiện của một mô hình được gọi là một tài liệu. Các mô hình chịu trách nhiệm tạo và đọc tài liệu từ cơ sở dữ liệu MongoDB bên dưới. Biên dịch mô hình đầu tiên của bạn.

Mô hình Mongoose trong NodeJS là gì?

Cầy mangut là gì? . a Node. 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.

MongoDB có tốt cho NodeJS không?

MongoDB biểu thị dữ liệu dưới dạng một tập hợp các tài liệu thay vì các bảng được liên kết bởi các khóa ngoại . Điều này giúp các loại dữ liệu khác nhau được xử lý qua internet có thể được lưu trữ và truy cập trong các ứng dụng web bằng Node. js.