Bản dịch của bài báo đã được chuẩn bị vào đêm trước khi bắt đầu khóa học
Điểm nổi bật:
- Điều cực kỳ quan trọng là phát triển một lược đồ mặc dù nó là tùy chọn trong MongoDB.
- Tương tự như vậy, các chỉ mục phải khớp với lược đồ và các mẫu truy cập của bạn.
- Tránh sử dụng các đối tượng lớn và mảng lớn.
- Hãy cẩn thận với cài đặt MongoDB, đặc biệt là khi nói đến bảo mật và độ tin cậy.
- MongoDB không có trình tối ưu hóa truy vấn nên bạn phải cẩn thận khi thực hiện các thao tác truy vấn.
Tôi đã làm việc với cơ sở dữ liệu trong một thời gian rất dài nhưng chỉ mới phát hiện ra MongoDB gần đây. Có một vài điều tôi ước mình biết trước khi bắt đầu làm việc với nó. Khi một người đã có kinh nghiệm trong một lĩnh vực nhất định, họ sẽ có những quan niệm định sẵn về cơ sở dữ liệu là gì và chúng làm gì. Với hy vọng giúp người khác dễ hiểu hơn, tôi trình bày danh sách các lỗi thường gặp.
Tạo máy chủ MongoDB mà không cần xác thực
Thật không may, MongoDB được cài đặt mà không có xác thực theo mặc định. Đối với một máy trạm được truy cập cục bộ, việc này là bình thường. Nhưng vì MongoDB là một hệ thống nhiều người dùng thích sử dụng lượng bộ nhớ lớn nên sẽ tốt hơn nếu bạn đặt nó trên một máy chủ có càng nhiều RAM càng tốt, ngay cả khi bạn chỉ sử dụng nó để phát triển. Việc cài đặt trên máy chủ qua cổng mặc định có thể gặp sự cố, đặc biệt nếu bất kỳ mã javascript nào có thể được thực thi trong yêu cầu (ví dụ: $where
như một ý tưởng cho
Có một số phương pháp xác thực, nhưng cách dễ nhất là đặt ID/mật khẩu người dùng. Hãy sử dụng ý tưởng này khi bạn nghĩ về việc xác thực ưa thích dựa trên
Đừng quên liên kết bề mặt tấn công của bạn với MongoDB
,
hoặc
. Vì các tệp dữ liệu không được mã hóa trong MongoDB tiêu chuẩn nên việc chạy MongoDB với
Lỗi khi phát triển mạch
MongoDB không sử dụng lược đồ. Nhưng điều này không có nghĩa là kế hoạch này là không cần thiết. Nếu bạn chỉ muốn lưu trữ tài liệu mà không có bất kỳ mẫu nhất quán nào thì việc lưu trữ chúng có thể nhanh chóng và dễ dàng nhưng việc truy xuất chúng sau này có thể khó khăn.
Bài viết kinh điển"
Đừng quên thứ tự sắp xếp
Việc quên thứ tự sắp xếp có thể gây ra nhiều thất vọng và lãng phí thời gian hơn bất kỳ cấu hình sai nào khác. Theo mặc định MongoBD sử dụng
Tạo bộ sưu tập với các tài liệu lớn
MongoDB rất vui khi lưu trữ các tài liệu lớn lên tới 16 MB trong các bộ sưu tập và
Tạo tài liệu với mảng lớn
Tài liệu có thể chứa mảng. Tốt nhất là số phần tử trong mảng không phải là số có bốn chữ số. Nếu các phần tử được thêm vào một mảng thường xuyên, nó sẽ phát triển nhanh hơn tài liệu chứa nó và sẽ cần phải được
MongoDB có một thứ gọi là
Bạn có thể nghĩ rằng bạn có thể làm mà không cần lập chỉ mục mảng. Thật không may, việc thiếu chỉ mục có thể khiến bạn gặp phải những vấn đề khác. Vì tài liệu được quét từ đầu đến cuối nên việc tìm kiếm các phần tử ở cuối mảng sẽ mất nhiều thời gian hơn và hầu hết các thao tác liên quan đến tài liệu đó sẽ
Đừng quên rằng thứ tự của các giai đoạn trong một tập hợp rất quan trọng
Trong hệ thống cơ sở dữ liệu có trình tối ưu hóa truy vấn, các truy vấn bạn viết là giải thích về những gì bạn muốn nhận chứ không phải cách lấy nó. Cơ chế này hoạt động tương tự như việc gọi món trong nhà hàng: thông thường bạn chỉ cần gọi một món ăn và không đưa ra hướng dẫn chi tiết cho người nấu.
Trong MongoDB, bạn hướng dẫn người nấu ăn. Ví dụ: bạn cần đảm bảo rằng dữ liệu đi qua reduce
càng sớm càng tốt trong quy trình bằng cách sử dụng $match
и $project
và việc sắp xếp chỉ xảy ra sau reduce
và việc tìm kiếm diễn ra theo đúng thứ tự bạn muốn. Việc có một trình tối ưu hóa truy vấn giúp loại bỏ những công việc không cần thiết, sắp xếp các bước một cách tối ưu và chọn các kiểu tham gia có thể giúp ích cho bạn. Với MongoDB, bạn có nhiều quyền kiểm soát hơn nhưng lại phải trả giá bằng sự tiện lợi.
Công cụ như
Sử dụng Ghi nhanh
Không bao giờ đặt tùy chọn ghi MongoDB có tốc độ cao nhưng độ tin cậy thấp. Chế độ này "file-và-quên" có vẻ nhanh vì lệnh được trả về trước khi quá trình ghi xảy ra. Nếu hệ thống gặp sự cố trước khi dữ liệu được ghi vào đĩa, nó sẽ bị mất và rơi vào trạng thái không nhất quán. May mắn thay, MongoDB 64-bit đã kích hoạt tính năng ghi nhật ký.
Công cụ lưu trữ MMAPv1 và WiredTiger sử dụng tính năng ghi nhật ký để ngăn chặn điều này, mặc dù WiredTiger có thể khôi phục về trạng thái nhất quán cuối cùng.
Việc ghi nhật ký đảm bảo rằng cơ sở dữ liệu ở trạng thái nhất quán sau khi khôi phục và giữ lại tất cả dữ liệu cho đến khi nó được ghi vào nhật ký. Tần số ghi được cấu hình bằng tham số
.
Để chắc chắn về các mục nhập, hãy đảm bảo tính năng ghi nhật ký được bật trong tệp cấu hình
và tần suất ghi tương ứng với lượng thông tin mà bạn có thể để mất.
Sắp xếp không có chỉ mục
Khi tìm kiếm và tổng hợp thường cần phải sắp xếp dữ liệu. Hãy hy vọng rằng việc này được thực hiện ở một trong những giai đoạn cuối cùng, sau khi lọc kết quả để giảm lượng dữ liệu được sắp xếp. Và ngay cả trong trường hợp này, để sắp xếp bạn sẽ cần
Nếu không có chỉ mục phù hợp, MongoDB sẽ không có nó. Có giới hạn bộ nhớ là 32 MB trên tổng kích thước của tất cả tài liệu trong
Tìm kiếm không hỗ trợ chỉ mục
Truy vấn tìm kiếm thực hiện chức năng tương tự như thao tác JOIN trong SQL. Để hoạt động tốt nhất, chúng cần chỉ mục giá trị của khóa được sử dụng làm khóa ngoại. Điều này không rõ ràng vì việc sử dụng không được phản ánh trong explain()
. Các chỉ số này ngoài chỉ mục được viết bằng explain()
, do đó được sử dụng bởi các nhà khai thác đường ống $match
и $sort
, khi chúng gặp nhau ở đầu đường ống. Các chỉ mục bây giờ có thể bao gồm bất kỳ giai đoạn nào
Từ chối sử dụng nhiều bản cập nhật
Phương thức
được sử dụng để thay đổi một phần tài liệu hiện có hoặc toàn bộ tài liệu, cho đến thay thế hoàn toàn, tùy thuộc vào tham số bạn chỉ định
. Điều không rõ ràng là nó sẽ không xử lý tất cả tài liệu trong bộ sưu tập trừ khi bạn đặt tùy chọn
để cập nhật tất cả các tài liệu đáp ứng tiêu chí yêu cầu.
Đừng quên tầm quan trọng của thứ tự các khóa trong bảng băm
Trong JSON, một đối tượng bao gồm một tập hợp không có thứ tự có kích thước bằng 0 hoặc nhiều cặp tên/giá trị, trong đó tên là một chuỗi và giá trị là một chuỗi, số, boolean, null, đối tượng hoặc mảng.
Thật không may, BSON lại chú trọng nhiều đến thứ tự khi tìm kiếm. Trong MongoDB, thứ tự các khóa trong các đối tượng tích hợp { firstname: "Phil", surname: "factor" }
- điều này không giống với { { surname: "factor", firstname: "Phil" }
. Nghĩa là, bạn phải lưu trữ thứ tự của các cặp tên/giá trị trong tài liệu của mình nếu bạn muốn chắc chắn tìm thấy chúng.
Đừng bối rối "Vô giá trị" и "không xác định"
Giá trị "không xác định" theo $null
, đó không phải lúc nào cũng là một giải pháp tốt.
Sử dụng $limit()
mà không $sort()
Thông thường, khi bạn đang phát triển trong MongoDB, việc chỉ xem mẫu kết quả sẽ được trả về từ một truy vấn hoặc tổng hợp là rất hữu ích. Đối với nhiệm vụ này bạn sẽ cần $limit()
, nhưng nó sẽ không bao giờ có trong mã cuối cùng trừ khi bạn sử dụng nó trước đó $sort
. Cơ chế này là cần thiết vì nếu không bạn không thể đảm bảo thứ tự của kết quả và bạn sẽ không thể xem dữ liệu một cách đáng tin cậy. Ở đầu kết quả, bạn sẽ nhận được các mục khác nhau tùy thuộc vào cách sắp xếp. Để hoạt động đáng tin cậy, các truy vấn và tập hợp phải mang tính xác định, nghĩa là tạo ra kết quả giống nhau mỗi khi chúng được thực thi. Mã có chứa $limit()
, nhưng không $sort
, sẽ không mang tính quyết định và sau đó có thể gây ra lỗi khó theo dõi.
Kết luận
Cách duy nhất để thất vọng với MongoDB là so sánh trực tiếp nó với một loại cơ sở dữ liệu khác, chẳng hạn như DBMS hoặc bắt đầu sử dụng nó dựa trên những kỳ vọng nhất định. Nó giống như so sánh một quả cam với một cái nĩa. Hệ thống cơ sở dữ liệu phục vụ các mục đích cụ thể. Tốt nhất bạn chỉ cần hiểu và đánh giá cao những khác biệt này cho chính mình. Sẽ thật xấu hổ khi gây áp lực cho các nhà phát triển MongoDB theo con đường buộc họ phải đi theo con đường DBMS. Tôi muốn thấy những cách mới và thú vị để giải quyết các vấn đề cũ, chẳng hạn như đảm bảo tính toàn vẹn dữ liệu và tạo ra các hệ thống dữ liệu có khả năng phục hồi trước các lỗi và các cuộc tấn công độc hại.
Việc giới thiệu giao dịch ACID của MongoDB trong phiên bản 4.0 là một ví dụ điển hình về việc giới thiệu những cải tiến quan trọng theo cách đổi mới. Các giao dịch đa tài liệu và nhiều câu lệnh giờ đây mang tính nguyên tử. Cũng có thể điều chỉnh thời gian cần thiết để lấy khóa và chấm dứt các giao dịch bị mắc kẹt, cũng như thay đổi mức độ cô lập.
Đọc thêm:
Nguồn: www.habr.com