2012-11-30 33 views
7

Tôi đang sử dụng JavaScript để truy vấn một API dựa trên một Mongo DB.MONGO DB Giống như nhà điều hành

tôi sẽ cần lọc các kết quả dựa trên điều hành LIKE, một cái gì đó tương tự như

select * from playlist where title like '%a%' 

Tại thời điểm tôi gọi URL này

var assetUrl = 'https://example.com/playlist?oauth_token=' + accessToken + '&account=XXX'+ '&fields={"title":true,"splash":true,"description":true,"source":true}'+ '&criteria={"title":/.*a.*/}'; 

Với không thành công (Return 0 đối tượng).

Tôi muốn biết tôi có nên sử dụng Cụm từ thông dụng thay thế không và cách sử dụng chúng trong ngữ cảnh này. Cảm ơn

Trả lời

18

Có, MongoDB hỗ trợ cụm từ thông dụng. Bạn có thể đọc về nó trong the documentation. Dưới đây là ví dụ:

db.collection.find({ url: /.*a.*/ }); 

Điều này tìm thấy tất cả tài liệu trong trường "url" khớp với cụm từ thông dụng. Ngoài ra còn có một cú pháp thay thế bằng cách sử dụng toán tử $ regex:

db.collection.find({ url: { $regex: ".*a.*"} }); 

Lưu ý rằng biểu thức chính quy chậm và quy mô kém. Thời gian tìm kiếm là tuyến tính với số lượng bản ghi trong bộ sưu tập và chỉ số chỉ trợ giúp khi biểu thức chính quy của bạn bắt đầu bằng một neo bắt đầu bằng chuỗi ^ (cảm ơn, chx).

Tài liệu cũng có một chương về Full Text Search in Mongo đề xuất chia từng chuỗi thành một mảng các từ riêng lẻ để bạn có thể lập chỉ mục để tìm kiếm nhanh hơn. Điều này tất nhiên không cho phép tìm kiếm các đoạn từ, nhưng rất nhiều tốc độ tìm kiếm các từ hoàn chỉnh.

Cập nhật: MongoDB 2.4 có a new experimental text-index feature cho phép để tăng tốc độ tìm kiếm văn bản với chỉ số.

Update2: Kể từ phiên bản 2.6, tìm kiếm văn bản được bật theo mặc định và sẵn sàng để sử dụng hiệu quả.

+2

biểu Đôi khi thường xuyên không chậm: "$ regex sử dụng chỉ số chỉ khi biểu thức chính quy có một neo cho đầu (tức là ^) của một chuỗi". http://docs.mongodb.org/manual/reference/operators/ – chx

+0

Cảm ơn bạn, @chx, tôi đã tích hợp thông tin đó vào câu trả lời của mình. – Philipp

0
var assetUrl = 'xxx.com/playlist?oauth_token=' + accessToken + '&account=xxx'+ '&fields='+escape('{"title":true,"splash":true,"description":true,"source":true}')+ '&criteria='+escape('{"title": {"$regex":".*ar.*"}}'); 

này giải quyết vấn đề của tôi