2015-09-22 17 views
10

tôi phải chạy truy vấn này trong JavaJava MongoDB regex truy vấn

đang
db.Users.find({"name": /^ind/i}) 

My Java là

Document findQuery = new Document(); 
findQuery.append("name", Pattern.compile("/^"+name+"/i")); 
FindIterable<Document> iterable = db.getCollection("Users").find(findQuery); 

Nó không được trả lại bất kỳ dữ liệu, tôi nghĩ các mã java trên được chuyển đổi

> /^ind/i into "/^ind/i" 

Xin cảm ơn trước.

Edit:

Dựa trên stribizhev đề nghị cập nhật các truy vấn và làm việc đang

db.Users.find({"name": {"$regex": /^ind/, "$options": "i"}}) 

Java của nó

Document regQuery = new Document(); 
regQuery.append("$regex", "^(?)" + Pattern.quote(name)); 
regQuery.append("$options", "i"); 

Document findQuery = new Document(); 
findQuery.append("name", regQuery); 
FindIterable<Document> iterable = db.getCollection("Users").find(findQuery); 
+2

Trong Java, không sử dụng delimiters regex. Hãy thử '"^(? I) "+ Pattern.quote (tên)' thay vì '"/^ "+ name +"/i "'. –

+0

Cảm ơn, nó đã làm việc về cơ bản "^ (?)" + Pattern.quote ("ind") giá trị được chuyển đổi thành^(?) \ Qind \ E – Indrajeet

+0

Vâng, đó là sự thật. Tôi đã đăng đề xuất làm câu trả lời. –

Trả lời

5

Bạn không thể sử dụng delimiters regex trong Java Pattern.compile, như có các phương tiện khác trong Java (ví dụ cờ) để làm tương tự.

Để thực thi tìm kiếm phân biệt chữ hoa chữ thường, hãy sử dụng công cụ sửa đổi nội tuyến (?i). Vì vậy, sử dụng "^(?i)"+Pattern.quote(name) thay vì "/^"+name+"/i".

Pattern.quote chỉ cần thoát tất cả các metacharacters regex để chúng được coi là chữ cái (giống như \Q ... \E).

+0

Có, chính xác vì vậy tôi đã cập nhật truy vấn mongo cũng như sử dụng db.Users.find ({"name": {"$ regex":/^ ind /, "$ options": "i"}}) Mã Java là Tài liệu regQuery = new Document(); \t \t \t \t regQuery.append ("$ regex", "^ (?)" + Pattern.quote (tên)); \t \t \t \t regQuery.append ("$ tùy chọn", "i"); – Indrajeet

+0

Bạn có thể thêm mã này vào cuối câu hỏi. –

3

Tôi đoán có một cách thanh lịch hơn để làm điều đó trong Java, bằng cách sử dụng các bộ lọc được cung cấp trong điều khiển MongoDB Java (phiên bản 3 trở lên):

Document query = new Document("equipment","gloves"); 

//whatever pattern you need. But you do not need the "/" delimiters 
String pattern = ".*" + query.getString("equipment") + ".*"; 

//find(regex("field name", "pattern", "options")); 
collection.find(regex("equipment", pattern, "i")); 
1

Bạn có thể sử dụng mẫu -Và Filters-

Pattern regex = Pattern.compile("ind", Pattern.CASE_INSENSITIVE); 
Bson filter = Filters.eq("name", regex); 

Các mẫu đối tượng có một số lá cờ khác, như bạn có thể nhìn thấy here

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