2011-11-22 44 views
9

Giả sử tôi có một bộ sưu tập người dùng và muốn triển khai tự động hoàn tất trên tên người dùng của những người dùng đó. Tôi nhìn vào các tài liệu mongodb và regex $ dường như là một cách để làm điều này. Có cách nào tốt hơn? Bởi tốt hơn tôi có nghĩa là thực hiện tốt hơn/thực hành tốt hơn.Triển khai tự động điền trên MongoDB

Trả lời

9

Theo đề xuất của @Thilo, bạn có thể sử dụng một số ý tưởng bao gồm tiền tố.

Điều quan trọng nhất là có yêu cầu rất nhanh (vì bạn muốn tự động hoàn thành cảm thấy tức thời). Vì vậy, bạn phải sử dụng truy vấn sẽ sử dụng các chỉ mục phù hợp.

Với regexp: sử dụng /^prefix/ (điều quan trọng là^để chỉ định bắt đầu dòng bắt buộc để tạo chỉ mục sử dụng truy vấn).

Truy vấn Phạm vi đó là tốt quá: { $gt : 'jhc', $lt: 'jhd' } }

phức tạp hơn nhưng nhanh hơn: bạn có thể lưu trữ tiền tố cây ở Mông Cổ (aka cố) với các mục như:

{usrPrefix : "anna", compl : ["annaconda", "annabelle", "annather"]} 
{usrPrefix : "ann", compl : ["anne", "annaconda", "annabelle", "annather"]} 

giải pháp cuối cùng này là rất nhanh (nếu tất cả các chỉ mục trên compl của khóa học) nhưng không phải là không gian hiệu quả ở tất cả. Bạn biết thương mại-off bạn có quá chọn.

+0

Câu trả lời hay. Mặc dù không hoàn thành với cố gắng. Cá nhân tôi chưa bao giờ có cảm giác 'tức thời' với việc sử dụng Regexes ở Mongo. Điều này nên làm các trick để làm cho nó nhanh hơn nhiều! – Vivek

+0

Thật vậy, regexp trong mongo không thực sự được thực hiện tốt. Tuy nhiên, khi bạn muốn một cái gì đó chất lỏng bạn không nghĩ để truy vấn cơ sở dữ liệu trong sống, độ trễ chỉ đơn giản là quá cao. Một cách thích hợp để thực hiện tự động hoàn thành sẽ là tải một cách không đồng bộ một số lần hoàn thành thông thường và hoàn thành khi thời gian (và đầu vào của người dùng) tiếp tục. – kamaradclimber

2

Nếu bạn đang tìm kiếm các tiền tố, bạn có thể sử dụng một truy vấn phạm vi (không chắc chắn về cú pháp chính xác):

db.users.find({'username': { $gt : 'jhc', $lt: 'jhd' } }) 

Và bạn muốn một chỉ mục trên các lĩnh vực tên người dùng.

+0

Bạn có thể giải thích cách truy vấn phạm vi hoạt động trong ví dụ này không? ví dụ: nếu tôi có "mèo" trong bộ sưu tập của tôi thì "ca" sẽ trả lại cụm từ chính xác như thế nào. – wazzaday

+0

Bạn có thể tìm kiếm mọi thứ giữa "ca" và "cb". 'ca Thilo

5

Chúng tôi làm điều đó bằng regex và nó nhanh như miễn là bạn có một chỉ số và bạn sử dụng/^ giá trị/

Hãy nhận biết bạn không thể sử dụng các trường hợp tùy chọn không nhạy cảm với một chỉ số, vì vậy bạn có thể muốn lưu trữ phiên bản chữ thường của chuỗi của bạn dưới dạng một trường khác trong tài liệu của bạn và sử dụng trường đó cho tự động điền.

Tôi đã thực hiện các thử nghiệm với hơn 3 triệu tài liệu và nó vẫn xuất hiện tức thời.

Các vấn đề liên quan