Tập lệnh di chuyển mongodb

MySQL và MongoDB là cơ sở dữ liệu nguồn mở rất phổ biến hiện nay. Thông qua blog này, tôi muốn chia sẻ một trường hợp sử dụng di chuyển cơ sở dữ liệu MySQL sang cơ sở dữ liệu MongoDB và có lẽ muốn chia sẻ một vài bài học trong quá trình di chuyển sẽ hữu ích

Có ba bước trong quá trình di chuyển

Giả sử bạn có một bảng người dùng với cấu trúc sau, bảng này cần được di chuyển sang bộ sưu tập MongoDB có tên là "người dùng"

[mã số]

+————+————–+——+—–+———+—————-+
. Đồng ruộng. Loại hình. Vô giá trị. Chìa khóa. Mặc định. Thêm.
+————+————–+——+—–+———+—————-+
. Tôi. bigint(20). KHÔNG. PRI. VÔ GIÁ TRỊ. auto_increment.
. phiên bản. bigint(20). KHÔNG. . VÔ GIÁ TRỊ. .
. địa chỉ. véc tơ(255). KHÔNG. . VÔ GIÁ TRỊ. .
. tuổi tác. int(11). KHÔNG. . VÔ GIÁ TRỊ. .
. họ. véc tơ(255). KHÔNG. . VÔ GIÁ TRỊ. .
. họ. véc tơ(255). KHÔNG. . VÔ GIÁ TRỊ. .
+————+————–+——+—–+———+—————-+

[/mã số]

Bước 1. Tạo csv của dữ liệu cho bảng hiện có

[mã số]

chọn first_name, last_name, địa chỉ, tuổi, phiên bản vào outfile ‘người dùng. csv’ CÁC LĨNH VỰC ĐƯỢC KẾT THÚC BỞI ‘,’ CÁC DÒNG ĐƯỢC KẾT THÚC BỞI ‘\n’ từ người dùng;

[/mã số]

Truy vấn này sẽ tạo một tệp có tên người dùng. csv vào thư mục cài đặt MySQL theo sau là tên cơ sở dữ liệu của bạn. Giả sử tên cơ sở dữ liệu của bạn là Test, thì tệp sẽ được tạo tại thư mục /var/lib/mysql/test

Bước 2. Bây giờ hãy di chuyển tệp vào thư mục thích hợp, nếu không bạn sẽ gặp lỗi về quyền đối với tệp. Trong trường hợp, bạn có tất cả các quyền, bạn có thể bỏ qua bước này

[mã] sudo mv /var/lib/mysql/test/user. csv Desktop/ [/code]

Bước 3. Giờ hãy nhập csv đã tạo vào MongoDB

[mã số]

mongoimport –host 127. 0. 0. 1 –port 27017–tên người dùng người dùng–mật khẩu pass–kiểm tra db–người dùng bộ sưu tập –type csv -f first_name,last_name,address,age,version –file Desktop/user. csv

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 Schema#add

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 SchemaType được 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 Loại lược đồ chuỗi và thuộc tính
const schema = new Schema({..}, { bufferCommands: false });
2 sẽ được chuyển thành Loại lược đồ
const schema = new Schema({..}, { bufferCommands: false });
3

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 con để 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 phương thức thể hiện của tài liệu, các phương thức Mô hình tĩnh, chỉ mục phức hợp và móc vòng đời 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 cái này để 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ả tại đây
  • 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 ngăn chặn ràng buộc
    const schema = new Schema({..}, { bufferCommands: false });
    
    17 một cách rõ ràng, 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 hàm
    const schema = new Schema({..}, { bufferCommands: false });
    
    00

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). Các hàm mũi tên rõ ràng ngăn chặn ràng buộc
const schema = new Schema({..}, { bufferCommands: false });
17, 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

const schema = new Schema({..}, { bufferCommands: false });
04 của chúng tôi ở cấp độ đường dẫn hoặc cấp độ
const schema = new Schema({..}, { bufferCommands: false });
05. 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 SchemaType#index() để biết 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

const schema = new Schema({..}, { bufferCommands: false });
06 cho từng chỉ mục được xác định trong lược đồ của bạn. Mongoose sẽ gọi
const schema = new Schema({..}, { bufferCommands: false });
06 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 });
06 thành công hoặc khi có lỗi. Mặc dù tốt cho quá trình 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 tác động hiệu suất đáng kể. Vô hiệu hóa hành vi bằng cách đặt tùy chọn
const schema = new Schema({..}, { bufferCommands: false });
09 của lược đồ của bạn thành
const schema = new Schema({..}, { bufferCommands: false });
00 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 });
09 thành
const schema = new Schema({..}, { bufferCommands: false });
00

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

const schema = new Schema({..}, { bufferCommands: false });
03 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 thức Model#ensureIndexes

Ảo 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 });
04

Nếu bạn sử dụng

const schema = new Schema({..}, { bufferCommands: false });
06 hoặc
const schema = new Schema({..}, { bufferCommands: false });
07 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 lệnh gọi
const schema = new Schema({..}, { bufferCommands: false });
08 trên tài liệu Mongoose, bởi vì
const schema = new Schema({..}, { bufferCommands: false });
08 gọi
const schema = new Schema({..}, { bufferCommands: false });
06. Vượt qua
const schema = new Schema({..}, { bufferCommands: false });
11 đến
const schema = new Schema({..}, { bufferCommands: false });
07 hoặc
const schema = new Schema({..}, { bufferCommands: false });
06

Bạn cũng có thể thêm một trình thiết lập 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 });
04

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 });
15 và
const schema = new Schema({..}, { bufferCommands: false });
16 đượ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 sẽ 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 trong dòng miễn là bạn sử dụng toàn bộ đường dẫn lồng nhau

const schema = new Schema({..}, { bufferCommands: false });
17 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 });
18

Tùy chọn hợp lệ

Theo mặc định, hàm

const schema = new Schema({..}, { bufferCommands: false });
19 của Mongoose 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
const schema = new Schema({..}, { bufferCommands: false });
00 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 });
09 thành false

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

Tùy chọn

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

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

const schema = new Schema({..}, { bufferCommands: false });
05 để tạo bộ sưu tập cơ bản trong MongoDB. Gọi
const schema = new Schema({..}, { bufferCommands: false });
06 đặt đối chiếu mặc định của bộ sưu tập dựa trên tùy chọn đối chiếu 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 tùy chọn lược đồ
const schema = new Schema({..}, { bufferCommands: false });
07

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 });
08 thành
const schema = new Schema({..}, { bufferCommands: false });
00 bằng cách sử dụng
const schema = new Schema({..}, { bufferCommands: false });
10. Giống như
const schema = new Schema({..}, { bufferCommands: false });
09,
const schema = new Schema({..}, { bufferCommands: false });
08 hữu ích cho các môi trường thử nghiệm và phát triển, 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 });
06 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 });
14 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 });
06 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 });
16 thành false

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

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

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

Nếu

const schema = new Schema({..}, { bufferCommands: false });
16 đượ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 });
07, hãy đặt tùy chọn
const schema = new Schema({..}, { bufferCommands: false });
07 thành kích thước tối đa của bộ sưu tập theo byte

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

Tùy chọn

const schema = new Schema({..}, { bufferCommands: false });
07 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ư max hoặc autoIndexId. Trong trường hợp này, bạn phải vượt qua tùy chọn
const schema = new Schema({..}, { bufferCommands: false });
63 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 các tiện ích. phương thức toCollectionName. 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 });
0

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 });
64, nhưng bạn có thể đặt
const schema = new Schema({..}, { bufferCommands: false });
65 để 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 });
66 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 });
66 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 Schema. Loại được gán là một ObjectId trùng 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 });
00. 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 đặt tùy chọn query#read ở cấp lược đồ, cung cấp cho chúng tôi cách áp dụng ReadPreferences 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ẻ tại đây và tại đây

GHI CHÚ. bạn cũng có thể chỉ định tùy chọn chiến lược ư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 });
0

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 });
1

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

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

const schema = new Schema({..}, { bufferCommands: false });
17 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 });
18, hãy đọc phần này

Các tài liệu có một phương thức toObject để chuyển đổi tài liệu cầy mangut 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 });
19 của bạn, hãy đặt tùy chọn
const schema = new Schema({..}, { bufferCommands: false });
20 thành
const schema = new Schema({..}, { bufferCommands: false });
21

Để 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 phần này

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 });
23 thành false

const schema = new Schema({..}, { bufferCommands: false });
24 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 });
24 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 });
26. 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 tối ưu cho

const schema = new Schema({..}, { bufferCommands: false });
27, bạn có thể đặt tùy chọn
const schema = new Schema({..}, { bufferCommands: false });
28

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 });
24 thành
const schema = new Schema({..}, { bufferCommands: false });
00. 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

const schema = new Schema({..}, { bufferCommands: false });
27. Nếu bạn sử dụng
const schema = new Schema({..}, { bufferCommands: false });
32,
const schema = new Schema({..}, { bufferCommands: false });
33, 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 });
0

Đồ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 });
34 hoặc
const schema = new Schema({..}, { bufferCommands: false });
35 và khi bạn cập nhật nó bằng cách sử dụng
const schema = new Schema({..}, { bufferCommands: false });
27

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

const schema = new Schema({..}, { bufferCommands: false });
37 chứa danh sách
const schema = new Schema({..}, { bufferCommands: false });
38 và một
const schema = new Schema({..}, { bufferCommands: false });
39 đại diện cho việc 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 });
40 phải có ít nhất hai
const schema = new Schema({..}, { bufferCommands: false });
38. 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 });
1

Hàm

const schema = new Schema({..}, { bufferCommands: false });
42 có vẻ đúng khi tách biệt, nhưng có thể có một vấn đề 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 });
35 và cuộc gọi
const schema = new Schema({..}, { bufferCommands: false });
27?

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

const schema = new Schema({..}, { bufferCommands: false });
28 trên lược đồ của mô hình
const schema = new Schema({..}, { bufferCommands: false });
37, 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 });
47 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 });
48 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 });
49 yêu cầu Mongoose gán các trường
const schema = new Schema({..}, { bufferCommands: false });
50 và
const schema = new Schema({..}, { bufferCommands: false });
51 cho lược đồ của bạn. Loại được chỉ định là Ngày

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

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

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

const schema = new Schema({..}, { bufferCommands: false });
49 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 });
    
    50 và
    const schema = new Schema({..}, { bufferCommands: false });
    
    51 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 });
    
    51 vào đối tượng
    const schema = new Schema({..}, { bufferCommands: false });
    
    60
  • Nếu bạn đặt
    const schema = new Schema({..}, { bufferCommands: false });
    
    61 cho thao tác cập nhật, cầy mangut sẽ sử dụng toán tử
    const schema = new Schema({..}, { bufferCommands: false });
    
    62 để thêm
    const schema = new Schema({..}, { bufferCommands: false });
    
    50 vào tài liệu trong trường hợp thao tác
    const schema = new Schema({..}, { bufferCommands: false });
    
    64 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 });
65 để 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 });
66. Mongoose sẽ gọi hàm
const schema = new Schema({..}, { bufferCommands: false });
66 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 });
68 vào lược đồ

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

Nếu bạn gọi

const schema = new Schema({..}, { bufferCommands: false });
69 với tùy chọn
const schema = new Schema({..}, { bufferCommands: false });
70, 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 });
68

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

const schema = new Schema({..}, { bufferCommands: false });
72 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 });
73 thành
const schema = new Schema({..}, { bufferCommands: false });
00 trong lược đồ 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 });
75 thành
const schema = new Schema({..}, { bufferCommands: false });
00 trên lược đồ con để khiến Mongoose chỉ báo cáo lỗi gốc

Các lược đồ có một phương thức

const schema = new Schema({..}, { bufferCommands: false });
77 mà bạn có thể sử dụng để tạo một 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 });
77 để 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