Có lược đồ trong mongodb không?

Nếu bạn chưa làm như vậy, vui lòng dành một phút để đọc phần bắt đầu nhanh để biết cách hoạt động của Mongoose. Nếu bạn đang di chuyển từ 5. x đến 6. x vui lòng dành chút thời gian để đọc hướng dẫn di chuyển

Mọi thứ trong Mongoose đều bắt đầu bằng Schema. Mỗi lược đồ ánh xạ tới một bộ sưu tập MongoDB và xác định hình dạng của các tài liệu trong bộ sưu tập đó

Nếu bạn muốn thêm các khóa bổ sung sau này, hãy sử dụng phương thức

Mỗi khóa trong mã

const schema = new Schema({..}, { bufferCommands: false });
0 của chúng tôi xác định một thuộc tính trong tài liệu của chúng tôi sẽ được truyền tới liên kết của nó. Ví dụ: chúng tôi đã xác định một thuộc tính
const schema = new Schema({..}, { bufferCommands: false });
1 sẽ được chuyển thành SchemaType và thuộc tính
const schema = new Schema({..}, { bufferCommands: false });
2 sẽ được chuyển thành một
const schema = new Schema({..}, { bufferCommands: false });
3 SchemaType

Lưu ý ở trên rằng nếu thuộc tính chỉ yêu cầu một loại, thì thuộc tính đó có thể được chỉ định bằng cách sử dụng ký hiệu tốc ký (đối chiếu thuộc tính

const schema = new Schema({..}, { bufferCommands: false });
1 ở trên với thuộc tính
const schema = new Schema({..}, { bufferCommands: false });
2)

Các khóa cũng có thể được gán các đối tượng lồng nhau chứa các định nghĩa khóa/loại khác như thuộc tính

const schema = new Schema({..}, { bufferCommands: false });
6 ở trên. Điều này sẽ xảy ra bất cứ khi nào giá trị của khóa là POJO không có thuộc tính
const schema = new Schema({..}, { bufferCommands: false });
7

Trong những trường hợp này, Mongoose chỉ tạo các đường dẫn lược đồ thực tế cho các lá trong cây. (như

const schema = new Schema({..}, { bufferCommands: false });
8 và
const schema = new Schema({..}, { bufferCommands: false });
9 ở trên) và các nhánh không có đường dẫn thực tế. Một tác dụng phụ của việc này là
const schema = new Schema({..}, { bufferCommands: false });
6 ở trên không thể có xác nhận của riêng nó. Nếu cần xác thực trên cây, một đường dẫn cần được tạo trên cây - xem phần Tài liệu phụ để biết thêm thông tin về cách thực hiện việc này. Đồng thời đọc tiểu mục Hỗn hợp của hướng dẫn SchemaTypes để biết một số vấn đề

SchemaTypes được phép là

Đọc thêm về SchemaTypes tại đây

Các lược đồ không chỉ xác định cấu trúc tài liệu của bạn và truyền các thuộc tính, chúng còn xác định các hook vòng đời của tài liệu, , và tài liệu được gọi là phần mềm trung gian

Để sử dụng định nghĩa lược đồ của chúng tôi, chúng tôi cần chuyển đổi

const schema = new Schema({..}, { bufferCommands: false });
0 thành Mô hình mà chúng tôi có thể làm việc cùng. Để làm như vậy, chúng tôi chuyển nó vào
const schema = new Schema({..}, { bufferCommands: false });
22

Theo mặc định, Mongoose thêm thuộc tính

const schema = new Schema({..}, { bufferCommands: false });
23 vào lược đồ của bạn

Khi bạn tạo một tài liệu mới với thuộc tính

const schema = new Schema({..}, { bufferCommands: false });
23 được thêm tự động, Mongoose sẽ tạo một
const schema = new Schema({..}, { bufferCommands: false });
23 mới thuộc loại ObjectId cho tài liệu của bạn

Bạn cũng có thể ghi đè lên

const schema = new Schema({..}, { bufferCommands: false });
23 mặc định của Mongoose bằng
const schema = new Schema({..}, { bufferCommands: false });
23 của riêng bạn. chỉ cần cẩn thận. Mongoose sẽ từ chối lưu tài liệu không có
const schema = new Schema({..}, { bufferCommands: false });
23, vì vậy bạn chịu trách nhiệm đặt
const schema = new Schema({..}, { bufferCommands: false });
23 nếu bạn xác định đường dẫn
const schema = new Schema({..}, { bufferCommands: false });
23 của riêng mình

Trường hợp của

const schema = new Schema({..}, { bufferCommands: false });
11 là tài liệu. Tài liệu có nhiều phương thức thể hiện tích hợp sẵn của riêng chúng. Chúng tôi cũng có thể xác định các phương thức thể hiện tài liệu tùy chỉnh của riêng mình

Giờ đây, tất cả các phiên bản

const schema = new Schema({..}, { bufferCommands: false });
12 của chúng tôi đều có sẵn phương thức
const schema = new Schema({..}, { bufferCommands: false });
13 cho chúng

  • Ghi đè phương thức tài liệu cầy mangut mặc định có thể dẫn đến kết quả không thể đoán trước. Xem để biết thêm chi tiết
  • Ví dụ trên sử dụng trực tiếp đối tượng
    const schema = new Schema({..}, { bufferCommands: false });
    
    14 để lưu một phương thức thể hiện. Bạn cũng có thể sử dụng trình trợ giúp
    const schema = new Schema({..}, { bufferCommands: false });
    
    15 như được mô tả
  • Không khai báo các phương thức sử dụng hàm mũi tên ES6 (______216). Các hàm mũi tên, vì vậy phương pháp của bạn sẽ không có quyền truy cập vào tài liệu và các ví dụ trên sẽ không hoạt động

Bạn cũng có thể thêm các hàm tĩnh vào mô hình của mình. Có ba cách tương đương để thêm một tĩnh

  • Thêm thuộc tính hàm vào đối số thứ hai của hàm tạo giản đồ (
    const schema = new Schema({..}, { bufferCommands: false });
    
    18)
  • Thêm thuộc tính hàm vào
    const schema = new Schema({..}, { bufferCommands: false });
    
    19
  • Gọi

Không khai báo số liệu thống kê bằng các hàm mũi tên ES6 (

const schema = new Schema({..}, { bufferCommands: false });
16). Hàm mũi tên , vì vậy các ví dụ trên sẽ không hoạt động do giá trị của
const schema = new Schema({..}, { bufferCommands: false });
17

Bạn cũng có thể thêm các hàm trợ giúp truy vấn, giống như các phương thức mẫu nhưng dành cho các truy vấn cầy mangut. Các phương thức của trình trợ giúp truy vấn cho phép bạn mở rộng API trình tạo truy vấn có thể xâu chuỗi của cầy mangut

MongoDB hỗ trợ các chỉ mục phụ. Với cầy mangut, chúng tôi xác định các chỉ mục này trong cấp độ

const schema = new Schema({..}, { bufferCommands: false });
14 hoặc
const schema = new Schema({..}, { bufferCommands: false });
15 của chúng tôi. Việc xác định các chỉ mục ở cấp lược đồ là cần thiết khi tạo các chỉ mục phức hợp

Xem các tùy chọn chỉ mục khác

Khi ứng dụng của bạn khởi động, Mongoose sẽ tự động gọi cho từng chỉ mục đã xác định trong lược đồ của bạn. Mongoose sẽ gọi

const schema = new Schema({..}, { bufferCommands: false });
16 cho từng chỉ mục theo tuần tự và phát ra sự kiện 'chỉ mục' trên mô hình khi tất cả các lệnh gọi
const schema = new Schema({..}, { bufferCommands: false });
16 thành công hoặc khi có lỗi. Mặc dù tốt cho sự phát triển, nhưng hành vi này nên bị vô hiệu hóa trong sản xuất vì việc tạo chỉ mục có thể gây ra lỗi. Vô hiệu hóa hành vi bằng cách đặt tùy chọn
const schema = new Schema({..}, { bufferCommands: false });
19 của lược đồ của bạn thành
const schema = new Schema({..}, { bufferCommands: false });
60 hoặc trên toàn cầu trên kết nối bằng cách đặt tùy chọn
const schema = new Schema({..}, { bufferCommands: false });
19 thành
const schema = new Schema({..}, { bufferCommands: false });
60

Mongoose sẽ phát ra một sự kiện

const schema = new Schema({..}, { bufferCommands: false });
63 trên mô hình khi các chỉ mục được xây dựng xong hoặc xảy ra lỗi

Xem thêm phương pháp

là các thuộc tính tài liệu mà bạn có thể lấy và đặt nhưng không được duy trì trong MongoDB. Các getter hữu ích cho việc định dạng hoặc kết hợp các trường, trong khi các setter hữu ích cho việc tách một giá trị thành nhiều giá trị để lưu trữ

Giả sử bạn muốn in ra tên đầy đủ của người đó. Bạn có thể tự làm điều đó

Nhưng việc nối họ và tên mỗi lần có thể trở nên rườm rà. Và điều gì sẽ xảy ra nếu bạn muốn thực hiện một số xử lý bổ sung đối với tên, chẳng hạn như xóa dấu phụ?

Bây giờ, cầy mangut sẽ gọi hàm getter của bạn mỗi khi bạn truy cập thuộc tính

const schema = new Schema({..}, { bufferCommands: false });
64

Nếu bạn sử dụng

const schema = new Schema({..}, { bufferCommands: false });
66 hoặc
const schema = new Schema({..}, { bufferCommands: false });
67 cầy mangut sẽ không bao gồm ảo theo mặc định. Điều này bao gồm đầu ra của việc gọi
const schema = new Schema({..}, { bufferCommands: false });
68 trên tài liệu Mongoose, bởi vì. Vượt qua
const schema = new Schema({..}, { bufferCommands: false });
51 cho một trong hai hoặc

Bạn cũng có thể thêm một trình cài đặt tùy chỉnh vào ảo của mình để cho phép bạn đặt cả họ và tên thông qua ảo

const schema = new Schema({..}, { bufferCommands: false });
64

Trình thiết lập thuộc tính ảo được áp dụng trước khi xác thực khác. Vì vậy, ví dụ trên sẽ vẫn hoạt động ngay cả khi trường tên

const schema = new Schema({..}, { bufferCommands: false });
55 và
const schema = new Schema({..}, { bufferCommands: false });
56 được yêu cầu

Chỉ các thuộc tính không ảo mới hoạt động như một phần của truy vấn và để chọn trường. Vì ảo không được lưu trữ trong MongoDB nên bạn không thể truy vấn với chúng

Bạn có thể tìm hiểu thêm về ảo tại đây

Bí danh là một loại ảo cụ thể trong đó getter và setter nhận và đặt thuộc tính khác một cách liền mạch. Điều này rất hữu ích để tiết kiệm băng thông mạng, vì vậy bạn có thể chuyển đổi một tên thuộc tính ngắn được lưu trữ trong cơ sở dữ liệu thành một tên dài hơn để mã có thể đọc được

Bạn cũng có thể khai báo bí danh trên các đường dẫn lồng nhau. Việc sử dụng các lược đồ và tài liệu con lồng nhau dễ dàng hơn, nhưng bạn cũng có thể khai báo các bí danh đường dẫn lồng nhau nội tuyến miễn là bạn sử dụng toàn bộ đường dẫn lồng nhau

const schema = new Schema({..}, { bufferCommands: false });
57 làm bí danh

Các lược đồ có một vài tùy chọn có thể định cấu hình có thể được chuyển đến hàm tạo hoặc phương thức

const schema = new Schema({..}, { bufferCommands: false });
58

Tùy chọn hợp lệ

Theo mặc định, Mongoose's tạo tất cả các chỉ mục được xác định trong lược đồ mô hình của bạn bằng cách gọi sau khi bạn kết nối thành công với MongoDB. Tạo chỉ mục tự động rất tốt cho môi trường phát triển và thử nghiệm. Nhưng các bản dựng chỉ mục cũng có thể tạo ra tải trọng đáng kể trên cơ sở dữ liệu sản xuất của bạn. Nếu bạn muốn quản lý các chỉ mục một cách cẩn thận trong quá trình sản xuất, bạn có thể đặt

const schema = new Schema({..}, { bufferCommands: false });
19 thành false

const schema = new Schema({..}, { bufferCommands: false });
2

Tùy chọn

const schema = new Schema({..}, { bufferCommands: false });
19 được đặt thành
const schema = new Schema({..}, { bufferCommands: false });
43 theo mặc định. Bạn có thể thay đổi mặc định này bằng cách thiết lập

Trước khi Mongoose xây dựng các chỉ mục, nó gọi

const schema = new Schema({..}, { bufferCommands: false });
45 để tạo bộ sưu tập cơ bản trong MongoDB theo mặc định. Gọi
const schema = new Schema({..}, { bufferCommands: false });
46 đặt đối chiếu mặc định của bộ sưu tập dựa trên và thiết lập bộ sưu tập dưới dạng bộ sưu tập giới hạn nếu bạn đặt

Bạn có thể vô hiệu hóa hành vi này bằng cách đặt

const schema = new Schema({..}, { bufferCommands: false });
48 thành
const schema = new Schema({..}, { bufferCommands: false });
60 bằng cách sử dụng. Giống như
const schema = new Schema({..}, { bufferCommands: false });
19,
const schema = new Schema({..}, { bufferCommands: false });
48 hữu ích cho môi trường phát triển và thử nghiệm, nhưng bạn có thể muốn tắt nó để sản xuất để tránh các cuộc gọi cơ sở dữ liệu không cần thiết

Thật không may,

const schema = new Schema({..}, { bufferCommands: false });
46 không thể thay đổi bộ sưu tập hiện có. Ví dụ: nếu bạn thêm
const schema = new Schema({..}, { bufferCommands: false });
24 vào lược đồ của mình và bộ sưu tập hiện có không bị giới hạn, thì
const schema = new Schema({..}, { bufferCommands: false });
46 sẽ không ghi đè lên bộ sưu tập hiện có. Đó là bởi vì máy chủ MongoDB không cho phép thay đổi tùy chọn của bộ sưu tập mà không loại bỏ bộ sưu tập trước

Theo mặc định, mongoose đệm các lệnh khi kết nối bị ngắt cho đến khi trình điều khiển quản lý để kết nối lại. Để tắt tính năng đệm, hãy đặt

const schema = new Schema({..}, { bufferCommands: false });
26 thành false

const schema = new Schema({..}, { bufferCommands: false });

Tùy chọn lược đồ

const schema = new Schema({..}, { bufferCommands: false });
26 ghi đè tùy chọn
const schema = new Schema({..}, { bufferCommands: false });
26 toàn cầu

Nếu

const schema = new Schema({..}, { bufferCommands: false });
26 được bật, tùy chọn này sẽ đặt lượng thời gian tối đa mà bộ đệm Mongoose sẽ đợi trước khi đưa ra lỗi. Nếu không được chỉ định, Mongoose sẽ sử dụng 10000 (10 giây)

Mongoose hỗ trợ các bộ sưu tập giới hạn MongoDB. Để chỉ định bộ sưu tập MongoDB cơ bản là

const schema = new Schema({..}, { bufferCommands: false });
47, hãy đặt tùy chọn
const schema = new Schema({..}, { bufferCommands: false });
47 thành kích thước tối đa của bộ sưu tập trong

const schema = new Schema({..}, { bufferCommands: false });
2

Tùy chọn

const schema = new Schema({..}, { bufferCommands: false });
47 cũng có thể được đặt thành một đối tượng nếu bạn muốn chuyển các tùy chọn bổ sung như hoặc. Trong trường hợp này, bạn phải vượt qua tùy chọn
const schema = new Schema({..}, { bufferCommands: false });
33 một cách rõ ràng, đây là tùy chọn bắt buộc

const schema = new Schema({..}, { bufferCommands: false });
1

Mongoose theo mặc định tạo tên bộ sưu tập bằng cách chuyển tên mô hình cho phương thức. Phương pháp này số nhiều tên. Đặt tùy chọn này nếu bạn cần một tên khác cho bộ sưu tập của mình

const schema = new Schema({..}, { bufferCommands: false });
1

Khi bạn xác định một bộ phân biệt đối xử, Mongoose sẽ thêm một đường dẫn vào lược đồ của bạn để lưu trữ bộ phân biệt mà một tài liệu là một thể hiện của. Theo mặc định, Mongoose thêm đường dẫn

const schema = new Schema({..}, { bufferCommands: false });
34, nhưng bạn có thể đặt
const schema = new Schema({..}, { bufferCommands: false });
35 để ghi đè đường dẫn mặc định này

Mongoose gán cho mỗi lược đồ của bạn một trình nhận ảo

const schema = new Schema({..}, { bufferCommands: false });
36 theo mặc định trả về trường
const schema = new Schema({..}, { bufferCommands: false });
23 của tài liệu được truyền thành một chuỗi hoặc trong trường hợp của ObjectIds, chuỗi hexString của nó. Nếu bạn không muốn thêm trình thu thập
const schema = new Schema({..}, { bufferCommands: false });
36 vào lược đồ của mình, bạn có thể tắt nó bằng cách chuyển tùy chọn này vào thời điểm xây dựng lược đồ

Mongoose gán cho mỗi lược đồ của bạn một trường

const schema = new Schema({..}, { bufferCommands: false });
23 theo mặc định nếu một lược đồ không được chuyển vào hàm tạo. Loại được chỉ định trùng khớp với hành vi mặc định của MongoDB. Nếu bạn hoàn toàn không muốn thêm một
const schema = new Schema({..}, { bufferCommands: false });
23 vào lược đồ của mình, bạn có thể tắt nó bằng tùy chọn này

Bạn chỉ có thể sử dụng tùy chọn này trên các tài liệu phụ. Mongoose không thể lưu tài liệu mà không biết id của nó, vì vậy bạn sẽ gặp lỗi nếu cố lưu tài liệu mà không có

const schema = new Schema({..}, { bufferCommands: false });
23

Theo mặc định, Mongoose sẽ "thu nhỏ" các lược đồ bằng cách xóa các đối tượng trống

Hành vi này có thể được ghi đè bằng cách đặt tùy chọn

const schema = new Schema({..}, { bufferCommands: false });
02 thành
const schema = new Schema({..}, { bufferCommands: false });
60. Sau đó, nó sẽ lưu trữ các đối tượng trống

Để kiểm tra xem một đối tượng có trống không, bạn có thể sử dụng trình trợ giúp

const schema = new Schema({..}, { bufferCommands: false });
04

Cho phép cài đặt các tùy chọn ở cấp lược đồ, cung cấp cho chúng tôi cách áp dụng mặc định cho tất cả các truy vấn bắt nguồn từ một mô hình

Bí danh của mỗi pref cũng được cho phép, vì vậy thay vì phải gõ 'secondaryPreferred' và viết sai chính tả, chúng ta chỉ cần chuyển 'sp'

Tùy chọn đọc cũng cho phép chúng tôi chỉ định bộ thẻ. Những thông báo này cho trình điều khiển biết các thành viên của bộ bản sao mà nó sẽ cố gắng đọc. Đọc thêm về bộ thẻ và tại đây

GHI CHÚ. bạn cũng có thể chỉ định tùy chọn ưu tiên đọc trình điều khiển khi kết nối

Cho phép đặt mối quan tâm ghi ở cấp lược đồ

const schema = new Schema({..}, { bufferCommands: false });
6

Tùy chọn

const schema = new Schema({..}, { bufferCommands: false });
05 được sử dụng khi chúng ta có kiến ​​trúc MongoDB được phân đoạn. Mỗi bộ sưu tập phân đoạn được cung cấp một khóa phân đoạn phải có trong tất cả các thao tác chèn/cập nhật. Chúng tôi chỉ cần đặt tùy chọn lược đồ này thành cùng một khóa phân đoạn và chúng tôi sẽ hoàn tất

const schema = new Schema({..}, { bufferCommands: false });
5

Lưu ý rằng Mongoose không gửi lệnh

const schema = new Schema({..}, { bufferCommands: false });
06 cho bạn. Bạn phải tự định cấu hình phân đoạn của mình

Tùy chọn nghiêm ngặt, (được bật theo mặc định), đảm bảo rằng các giá trị được chuyển đến hàm tạo mô hình của chúng tôi không được chỉ định trong lược đồ của chúng tôi sẽ không được lưu vào db

Điều này cũng ảnh hưởng đến việc sử dụng

const schema = new Schema({..}, { bufferCommands: false });
07 để đặt giá trị thuộc tính

Giá trị này có thể được ghi đè ở cấp độ phiên bản mô hình bằng cách chuyển đối số boolean thứ hai

Tùy chọn

const schema = new Schema({..}, { bufferCommands: false });
08 cũng có thể được đặt thành
const schema = new Schema({..}, { bufferCommands: false });
09, điều này sẽ gây ra lỗi thay vì loại bỏ dữ liệu xấu

GHI CHÚ. Bất kỳ khóa/giá trị nào được đặt trên phiên bản không tồn tại trong lược đồ của bạn luôn bị bỏ qua, bất kể tùy chọn lược đồ là gì

Mongoose hỗ trợ tùy chọn

const schema = new Schema({..}, { bufferCommands: false });
10 riêng biệt để tránh chế độ nghiêm ngặt cho các bộ lọc truy vấn. Điều này là do bộ lọc truy vấn trống khiến Mongoose trả lại tất cả tài liệu trong mô hình, điều này có thể gây ra sự cố

Tùy chọn

const schema = new Schema({..}, { bufferCommands: false });
08 áp dụng cho các bản cập nhật. Tùy chọn
const schema = new Schema({..}, { bufferCommands: false });
10 chỉ dành cho bộ lọc truy vấn

Mongoose có tùy chọn

const schema = new Schema({..}, { bufferCommands: false });
10 riêng để chuyển chế độ nghiêm ngặt cho tham số
const schema = new Schema({..}, { bufferCommands: false });
14 thành truy vấn

Nói chung, chúng tôi khuyên bạn không nên chuyển các đối tượng do người dùng xác định làm bộ lọc truy vấn

Trong Mongoose 6, theo mặc định,

const schema = new Schema({..}, { bufferCommands: false });
10 bằng với
const schema = new Schema({..}, { bufferCommands: false });
08. Tuy nhiên, bạn có thể ghi đè hành vi này trên toàn cầu

Trong Mongoose 7, giá trị mặc định của

const schema = new Schema({..}, { bufferCommands: false });
10 sẽ được chuyển về
const schema = new Schema({..}, { bufferCommands: false });
60. Bạn có thể chuẩn bị cho sự thay đổi bằng cách chỉ định

Hoàn toàn giống với tùy chọn nhưng chỉ áp dụng khi phương thức

const schema = new Schema({..}, { bufferCommands: false });
19 của tài liệu được gọi

Để xem tất cả các tùy chọn có sẵn của

const schema = new Schema({..}, { bufferCommands: false });
20, hãy đọc

Các tài liệu có một phương thức chuyển đổi tài liệu mongoose thành một đối tượng JavaScript đơn giản. Phương pháp này chấp nhận một số tùy chọn. Thay vì áp dụng các tùy chọn này trên cơ sở từng tài liệu, chúng tôi có thể khai báo các tùy chọn ở cấp lược đồ và áp dụng chúng cho tất cả các tài liệu của lược đồ theo mặc định

Để tất cả các ảo hiển thị trong đầu ra

const schema = new Schema({..}, { bufferCommands: false });
21 của bạn, hãy đặt tùy chọn
const schema = new Schema({..}, { bufferCommands: false });
22 thành
const schema = new Schema({..}, { bufferCommands: false });
23

Để xem tất cả các tùy chọn

const schema = new Schema({..}, { bufferCommands: false });
22 có sẵn, hãy đọc

Theo mặc định, nếu bạn có một đối tượng có khóa 'type' trong lược đồ của mình, cầy mangut sẽ diễn giải nó dưới dạng khai báo kiểu

Tuy nhiên, đối với các ứng dụng như GeoJSON, thuộc tính 'type' rất quan trọng. Nếu bạn muốn kiểm soát cầy mangut khóa nào sử dụng để tìm khai báo kiểu, hãy đặt tùy chọn lược đồ 'typeKey'

Theo mặc định, các tài liệu được tự động xác thực trước khi chúng được lưu vào cơ sở dữ liệu. Điều này là để ngăn việc lưu một tài liệu không hợp lệ. Nếu bạn muốn xử lý xác thực theo cách thủ công và có thể lưu các đối tượng không vượt qua xác thực, bạn có thể đặt

const schema = new Schema({..}, { bufferCommands: false });
25 thành false

const schema = new Schema({..}, { bufferCommands: false });
26 là một thuộc tính được đặt trên mỗi tài liệu khi được Mongoose tạo lần đầu tiên. Giá trị khóa này chứa bản sửa đổi nội bộ của tài liệu. Tùy chọn
const schema = new Schema({..}, { bufferCommands: false });
26 là một chuỗi đại diện cho đường dẫn sử dụng để lập phiên bản. Mặc định là
const schema = new Schema({..}, { bufferCommands: false });
28. Nếu điều này xung đột với ứng dụng của bạn, bạn có thể định cấu hình như vậy

Lưu ý rằng phiên bản mặc định của Mongoose không phải là một giải pháp đồng thời lạc quan đầy đủ. Phiên bản mặc định của Mongoose chỉ hoạt động trên các mảng như hình bên dưới

Nếu bạn cần hỗ trợ đồng thời lạc quan cho

const schema = new Schema({..}, { bufferCommands: false });
29, bạn có thể đặt

Phiên bản tài liệu cũng có thể bị vô hiệu hóa bằng cách đặt

const schema = new Schema({..}, { bufferCommands: false });
26 thành
const schema = new Schema({..}, { bufferCommands: false });
60. KHÔNG vô hiệu hóa phiên bản trừ khi bạn biết mình đang làm gì

Mongoose chỉ cập nhật khóa phiên bản khi bạn sử dụng. Nếu bạn sử dụng

const schema = new Schema({..}, { bufferCommands: false });
34,
const schema = new Schema({..}, { bufferCommands: false });
35, v.v. Mongoose sẽ không cập nhật khóa phiên bản. Như một giải pháp thay thế, bạn có thể sử dụng phần mềm trung gian bên dưới

const schema = new Schema({..}, { bufferCommands: false });
4

Đồng thời lạc quan là một chiến lược để đảm bảo tài liệu bạn đang cập nhật không thay đổi giữa khi bạn tải nó bằng cách sử dụng

const schema = new Schema({..}, { bufferCommands: false });
36 hoặc
const schema = new Schema({..}, { bufferCommands: false });
37 và khi bạn cập nhật nó bằng cách sử dụng
const schema = new Schema({..}, { bufferCommands: false });
29

Ví dụ: giả sử bạn có một mô hình

const schema = new Schema({..}, { bufferCommands: false });
39 chứa danh sách
const schema = new Schema({..}, { bufferCommands: false });
40 và một
const schema = new Schema({..}, { bufferCommands: false });
41 thể hiện liệu ngôi nhà này có xuất hiện trong các tìm kiếm hay không. Giả sử rằng một ngôi nhà có trạng thái
const schema = new Schema({..}, { bufferCommands: false });
42 phải có ít nhất hai
const schema = new Schema({..}, { bufferCommands: false });
40. Bạn có thể thực hiện logic phê duyệt tài liệu nhà như hình dưới đây

const schema = new Schema({..}, { bufferCommands: false });
2

Hàm

const schema = new Schema({..}, { bufferCommands: false });
44 có vẻ đúng khi tách biệt, nhưng có thể có sự cố tiềm ẩn. điều gì sẽ xảy ra nếu một chức năng khác xóa ảnh của ngôi nhà giữa cuộc gọi
const schema = new Schema({..}, { bufferCommands: false });
37 và cuộc gọi
const schema = new Schema({..}, { bufferCommands: false });
29?

Nếu bạn đặt tùy chọn

const schema = new Schema({..}, { bufferCommands: false });
30 trên lược đồ của mô hình
const schema = new Schema({..}, { bufferCommands: false });
39, tập lệnh trên sẽ báo lỗi

Đặt đối chiếu mặc định cho mọi truy vấn và tổng hợp. Dưới đây là tổng quan thân thiện với người mới bắt đầu về các bộ sưu tập

Nếu bạn đặt tùy chọn

const schema = new Schema({..}, { bufferCommands: false });
49 trên lược đồ, Mongoose sẽ tạo bộ sưu tập chuỗi thời gian cho bất kỳ mô hình nào bạn tạo từ lược đồ đó

const schema = new Schema({..}, { bufferCommands: false });
50 cho phép loại trừ các đường dẫn khỏi phiên bản (i. e. , bản sửa đổi nội bộ sẽ không được tăng lên ngay cả khi các đường dẫn này được cập nhật). KHÔNG làm điều này trừ khi bạn biết bạn đang làm gì. Đối với các tài liệu phụ, hãy đưa tài liệu này vào tài liệu gốc bằng cách sử dụng đường dẫn đủ điều kiện

Tùy chọn

const schema = new Schema({..}, { bufferCommands: false });
51 yêu cầu Mongoose gán các trường
const schema = new Schema({..}, { bufferCommands: false });
52 và
const schema = new Schema({..}, { bufferCommands: false });
53 cho lược đồ của bạn. Loại được chỉ định là

Theo mặc định, tên của các trường là

const schema = new Schema({..}, { bufferCommands: false });
52 và
const schema = new Schema({..}, { bufferCommands: false });
53. Tùy chỉnh tên trường bằng cách đặt
const schema = new Schema({..}, { bufferCommands: false });
56 và
const schema = new Schema({..}, { bufferCommands: false });
57

Cách thức hoạt động của

const schema = new Schema({..}, { bufferCommands: false });
51 dưới mui xe là

  • Nếu bạn tạo một tài liệu mới, cầy mangut chỉ cần đặt
    const schema = new Schema({..}, { bufferCommands: false });
    
    52 và
    const schema = new Schema({..}, { bufferCommands: false });
    
    53 vào thời điểm tạo
  • Nếu bạn cập nhật tài liệu, cầy mangut sẽ thêm
    const schema = new Schema({..}, { bufferCommands: false });
    
    53 vào đối tượng
    const schema = new Schema({..}, { bufferCommands: false });
    
    62
  • Nếu bạn đặt
    const schema = new Schema({..}, { bufferCommands: false });
    
    63 cho thao tác cập nhật, cầy mangut sẽ sử dụng toán tử
    const schema = new Schema({..}, { bufferCommands: false });
    
    64 để thêm
    const schema = new Schema({..}, { bufferCommands: false });
    
    52 vào tài liệu trong trường hợp thao tác
    const schema = new Schema({..}, { bufferCommands: false });
    
    66 dẫn đến một tài liệu được chèn mới

Theo mặc định, Mongoose sử dụng

const schema = new Schema({..}, { bufferCommands: false });
67 để lấy thời gian hiện tại. Nếu bạn muốn ghi đè chức năng mà Mongoose sử dụng để lấy thời gian hiện tại, bạn có thể đặt tùy chọn
const schema = new Schema({..}, { bufferCommands: false });
68. Mongoose sẽ gọi hàm
const schema = new Schema({..}, { bufferCommands: false });
68 bất cứ khi nào nó cần lấy thời gian hiện tại

Mongoose hỗ trợ xác định các plugin toàn cầu, các plugin áp dụng cho tất cả các lược đồ

Đôi khi, bạn có thể chỉ muốn áp dụng một plugin nhất định cho một số lược đồ. Trong trường hợp đó, bạn có thể thêm

const schema = new Schema({..}, { bufferCommands: false });
70 vào lược đồ

const schema = new Schema({..}, { bufferCommands: false });
3

Nếu bạn gọi

const schema = new Schema({..}, { bufferCommands: false });
71 với tùy chọn
const schema = new Schema({..}, { bufferCommands: false });
72, Mongoose sẽ chỉ áp dụng plugin đó cho các lược đồ có mục phù hợp trong
const schema = new Schema({..}, { bufferCommands: false });
70

Theo mặc định, Mongoose sẽ tự động

const schema = new Schema({..}, { bufferCommands: false });
74 bất kỳ đường dẫn nào được điền cho bạn, trừ khi bạn loại trừ chúng một cách rõ ràng

Để từ chối chọn các trường được điền theo mặc định, hãy đặt

const schema = new Schema({..}, { bufferCommands: false });
75 thành
const schema = new Schema({..}, { bufferCommands: false });
60 trong giản đồ của bạn

Vì các lý do cũ, khi có lỗi xác thực trong đường dẫn con của một lược đồ lồng nhau, Mongoose cũng sẽ ghi lại rằng cũng có lỗi xác thực trong đường dẫn lược đồ lồng nhau. Ví dụ

Đặt

const schema = new Schema({..}, { bufferCommands: false });
77 thành
const schema = new Schema({..}, { bufferCommands: false });
60 trên lược đồ con để khiến Mongoose chỉ báo cáo lỗi gốc

Các lược đồ có một lược đồ mà bạn có thể sử dụng để tạo lược đồ Mongoose từ một lớp ES6

Đây là một ví dụ về việc sử dụng

const schema = new Schema({..}, { bufferCommands: false });
79 để tạo một lược đồ từ một lớp ES6

Các lược đồ cũng có thể cắm được, cho phép chúng tôi đóng gói các tính năng có thể tái sử dụng thành các plugin có thể chia sẻ với cộng đồng hoặc chỉ giữa các dự án của bạn

Đây là phần giới thiệu thay thế cho các lược đồ Mongoose

Để tận dụng tối đa MongoDB, bạn cần tìm hiểu kiến ​​thức cơ bản về thiết kế lược đồ MongoDB. Thiết kế lược đồ SQL (dạng chuẩn thứ ba) được thiết kế để giảm thiểu chi phí lưu trữ, trong khi thiết kế lược đồ MongoDB là thực hiện các truy vấn phổ biến nhanh nhất có thể. Chuỗi blog 6 Rules of Thumb for MongoDB Schema Design là một tài nguyên tuyệt vời để tìm hiểu các quy tắc cơ bản giúp thực hiện các truy vấn của bạn nhanh chóng

Người dùng đang tìm cách làm chủ thiết kế lược đồ MongoDB trong Node. js nên xem cuốn The Little MongoDB Schema Design Book của Christian Kvalheim, tác giả gốc của MongoDB Node. trình điều khiển js. Cuốn sách này chỉ cho bạn cách triển khai các lược đồ hiệu suất cho danh sách các trường hợp sử dụng đã được giặt sạch, bao gồm thương mại điện tử, wiki và đặt lịch hẹn

MongoDB có lược đồ không?

Dữ liệu trong MongoDB có lược đồ linh hoạt . Bộ sưu tập không thực thi cấu trúc tài liệu theo mặc định. Tính linh hoạt này cung cấp cho bạn các lựa chọn lập mô hình dữ liệu để phù hợp với ứng dụng của bạn và các yêu cầu về hiệu suất của nó.

Lược đồ được gọi trong MongoDB là gì?

Lược đồ là gì? . Bạn có thể sử dụng lược đồ BSON của Atlas App Services, mở rộng tiêu chuẩn Lược đồ JSON, để xác định mô hình dữ liệu của ứng dụng và xác thực tài liệu bất cứ khi nào chúng được tạo, thay đổi hoặc xóa. a JSON object that defines the the structure and contents of your data. You can use Atlas App Services' BSON schemas, which extend the JSON Schema standard, to define your application's data model and validate documents whenever they're created, changed, or deleted.

Làm cách nào để tạo lược đồ trong MongoDB?

Như chúng ta đã biết MongoDB không có lược đồ, tại thời điểm tạo bất kỳ đối tượng nào, chúng tôi không thể tạo bất kỳ lược đồ nào trong MongoDB . Chúng ta có thể thực thi lược đồ cho bộ sưu tập trong MongoDB bằng cách sử dụng cụm tập bản đồ MongoDB, để thực thi lược đồ tài liệu, trước tiên chúng ta cần kết nối cơ sở dữ liệu và bộ sưu tập.

MongoDB có lược đồ cố định không?

Các bộ sưu tập trong MongoDB không có lược đồ cố định hoặc yêu cầu tất cả các tài liệu trong một bộ sưu tập phải có cùng một lược đồ. Bạn chắc chắn có thể thêm hoặc xóa trường, thay đổi loại trường hoặc cập nhật xác thực Lược đồ JSON mà không cần tạo lại bộ sưu tập.