MongoDB sắp xếp theo khoảng cách
Trong loạt bài viết này, tôi sẽ mô tả một số kỹ thuật cần thiết để truy vấn dữ liệu không gian địa lý trong MongoDB, điều này có thể hữu ích nếu bạn muốn ứng dụng hoặc API của mình cung cấp quyền truy cập vào thông tin được sắp xếp dựa trên khoảng cách từ một số vị trí cụ thể. Ví dụ
Các kỹ thuật này sẽ cho phép dịch vụ của bạn mở rộng quy mô và duy trì hiệu quả vì chúng cho phép truy cập dữ liệu theo thời gian liên tục (bất kể lượng dữ liệu trong cơ sở dữ liệu của bạn là bao nhiêu) và giảm thiểu yêu cầu bộ nhớ đệm ở phía máy khách Bạn sẽ học được gìTrong các phần sau tôi sẽ chỉ cho bạn cách
Bạn sẽ có thể làm theo hướng dẫn này ngay cả khi bạn chưa từng sử dụng MongoDB trước đây. Mặt khác, nếu 2 điểm đầu tiên nghe có vẻ quen thuộc, bạn có thể chuyển thẳng sang phần 3 Chúng tôi sẽ sử dụng Node. js và trình điều khiển Javascript MongoDB chính thức. Các đoạn mã sẽ có trong Coffeescript 2 Nếu bạn muốn chạy các ví dụ mã cục bộ, hãy sao chép repo đi kèm và làm theo hướng dẫn trong Đối với các cặp kinh độ, vĩ độ, chúng ta cần sử dụng định dạng đối tượng
Lưu ý rằng
Bây giờ bạn đã biết những điều cơ bản, hãy tạo một số dữ liệu để làm việc với Chúng tôi đã tạo 6 tài liệu, với các vị trí bắt đầu từ đường xích đạo, tăng vĩ độ theo các khoảng thời gian bằng nhau, trong khi vẫn giữ cố định kinh độ ở 0. Dưới đây là các điểm được vẽ trên một hình cầu Lưu ý rằng trong các ví dụ mã sau đây, chúng tôi sẽ bỏ qua bản soạn sẵn cần thiết để lấy đối tượng bộ sưu tập mongodb và chèn tài liệu vào đó. Trong repo đi kèm, bản tóm tắt này đã được chứa trong các hàm trợ giúp Để truy vấn các tài liệu dựa trên khoảng cách của chúng từ một điểm cụ thể, chúng ta sẽ sử dụng toán tử truy vấn Đặt tùy chọn nền là rất quan trọng khi tạo chỉ mục trên cơ sở dữ liệu trực tiếp, vì theo mặc định sẽ chặn tất cả các hoạt động khác trên cơ sở dữ liệu trong khi chỉ mục đang được tạo (có thể mất một lúc nếu bộ sưu tập lớn) Bây giờ, truy vấn cơ bản, trả về tất cả tài liệu được sắp xếp theo khoảng cách ( chính xác là khoảng cách vòng tròn lớn ) từ điểm Trừ khi ý định của bạn là xử lý tất cả các tài liệu trong bộ sưu tập ( trong trường hợp đó, bạn có thể gọi là ____1_______2 thay vì ____1_______3 ), bạn sẽ muốn giới hạn số lượng tài liệu được trả lại. Đây là cách nó được thực hiện ví dụ có thể chạy được trên githubTrong hình minh họa bên dưới, điểm màu trắng đánh dấu vị trí được sử dụng trong truy vấn trên ( Ghi chú. kỹ thuật được thảo luận trong phần này đã được mô tả trước đây bởi A. Jesse Jiryu Davis, người đã triển khai tính năng MondoDB giúp cho kỹ thuật này trở nên khả thi. Bài viết của anh ấy đi vào chi tiết về lý do tại sao phương pháp này hoạt động hiệu quả, vì vậy nó đáng để đọc, tuy nhiên các ví dụ về mã là trong python, do đó, chúng tôi sẽ thực hiện từng bước tại đây vì lợi ích của Node. cộng đồng js Dựa trên truy vấn mà chúng tôi đã xác định trong phần trước, cách đơn giản nhất để triển khai phân trang là sử dụng Truy vấn trên sẽ trả về trang kết quả thứ 2 khi truy vấn dữ liệu thử nghiệm của chúng tôi, như minh họa bên dưới xem mã được sử dụng để tạo mã này trên JSFiddleTuy nhiên, hiệu suất của Một giải pháp thay thế thời gian không đổi liên quan đến việc sử dụng toán tử truy vấn Giả sử rằng chúng ta biết khoảng cách giữa điểm truy vấn và tài liệu xa nhất từ một trang kết quả nhất định, chúng ta có thể truy vấn trang tiếp theo như sau Nhưng chúng ta lấy khoảng cách từ đâu? . Hoặc sử dụng một cái gì đó như Bây giờ chúng ta có thể sử dụng thuộc tính Và đây là hình ảnh trực quan về kết quả của lệnh gọi thứ hai tới Tuy nhiên, đây không phải là chính xác những gì chúng tôi muốn. tài liệu cuối cùng của trang trước được đưa vào trang tiếp theo, vì Truy vấn sử dụng toán tử Lưu ý rằng điểm thứ 2 và thứ 3 nằm ở cùng một khoảng cách chính xác từ điểm Điều này là do cả Đưa ra Lưu ý rằng logic trong Cuối cùng, chúng ta cần xử lý trường hợp có quá nhiều tài liệu có cùng khoảng cách, đến nỗi tài liệu cuối cùng trong một trang có cùng khoảng cách với Sử dụng triển khai ở trên, chúng tôi sẽ nhận được điểm Điều đáng chú ý là trong trường hợp cực đoan, tất cả các tài liệu có cùng khoảng cách, kích thước của mảng Cuối cùng, tôi muốn bạn lưu ý rằng phương pháp trên không hỗ trợ chuyển trực tiếp đến một trang cụ thể ( mà không tìm nạp tất cả các trang ở giữa ). Tuy nhiên, điều này có thể đạt được bằng cách thêm Chúng tôi đã trình bày cách lưu trữ và truy vấn dữ liệu không gian địa lý trong mongodb và thảo luận cách chuyển trang hiệu quả qua lượng lớn dữ liệu đó (từ vị trí gần nhất đến vị trí xa nhất). Trong Phần 2 của loạt bài này, bạn sẽ học cách sử dụng một thủ thuật tiện lợi để lật trang qua các vị trí theo thứ tự ngược lại Đừng quên sao chép repo đi kèm và chơi với các ví dụ mã có thể dễ dàng chạy từ dòng lệnh |