2012-04-20 40 views
35

Làm cách nào để tìm tất cả các đối tượng trong cơ sở dữ liệu với trường của đối tượng chứa chuỗi con?Cách tìm chuỗi con trong trường trong Mongodb

Nếu trường là A trong một đối tượng của một bộ sưu tập với một giá trị chuỗi:

Tôi muốn tìm tất cả các đối tượng trong db "cơ sở dữ liệu" trong đó A có chứa một chuỗi con nói "abc def".

tôi đã cố gắng:

db.database.find({A: {$regex: '/^*(abc def)*$/''}}) 

nhưng đã không làm việc

CẬP NHẬT

Một chuỗi thực tế (trong unicode):

Sujet Commentaire sur Star Wars Episode III - La Revanche des Sith 1 

Cần để tìm kiếm tất cả mục nhập với Star Wars

db.test.find({A: {$regex: '^*(star wars)*$''}}) not wokring 
+1

Như @derick chỉ ra, nếu bạn muốn tìm "bất kỳ chuỗi ký tự nào", bạn cần '. *': '.' cho bất kỳ ký tự (đơn) nào,' * 'cho" điều trước đó bất kỳ số nào (bao gồm số không). '(Star wars) * $' mà bạn có sẽ khớp với "các cuộc chiến tranh warsstar warsstar wars star" nhưng không phải "cuộc chiến tranh sao là tuyệt vời". – drevicko

Trả lời

39

Thay vì điều này:

db.database.find({A: {$regex: '/^*(abc def)*$/''}}) 

Bạn nên làm điều này:

db.database.find({A: /abc def/i }) 

^* không phải là cú pháp thực sự có giá trị như^và $ là neo và không phải cái gì đó là có thể lặp lại. Bạn có thể có nghĩa là ^. * Ở đây. Nhưng không cần thiết cho ^. * Vì điều đó đơn giản có nghĩa là "Mọi thứ liên quan đến nhân vật sau" và (abc def) * có nghĩa là "0 hoặc nhiều lần" abc def ", nhưng nó phải ở cuối chuỗi, vì $ của bạn. các "i" ở cuối là để làm cho nó phân biệt dạng chữ.

+2

lưu ý rằng việc sử dụng '^' giúp tăng tốc truy vấn regex vì các chỉ mục sẽ chỉ có hiệu lực trong biểu mẫu này (xem phần dưới cùng của trang tại http://docs.mongodb.org/manual/reference/operator/regex/) –

+0

Chính xác nếu tôi sai, nhưng '^ *' có ý nghĩa gì không? Không phải là '^. *'? Để tôi '^ *' đọc "không hoặc nhiều lần bắt đầu của dòng", trong đó chỉ có và luôn luôn một, và nó trông giống như tôi __doesn't__ cho phép các ký tự giữa đầu của dòng và phần còn lại của regex ... – drevicko

+0

@drevicko, bạn nói đúng. Đó là một lỗi đánh máy trong câu trả lời của tôi. Tôi đã làm rõ nó. – Derick

16

Chỉ cần sử dụng chuỗi "Star Wars" và $regex sẽ làm phần còn lại

db.test.find({A: {$regex: 'Star Wars'}}) 
Các vấn đề liên quan