2017-04-25 21 views
5

Đây là phiên trình bao MongoDB của tôi;MongoDB regex phù hợp với sự cố

> db.foo.save({path: 'a:b'}) 
WriteResult({ "nInserted" : 1 }) 

> db.foo.findOne() 
{ "_id" : ObjectId("58fedc47622e89329d123ee8"), "path" : "a:b" } 

> db.foo.save({path: 'a:b:c'}) 
WriteResult({ "nInserted" : 1 }) 

> db.foo.find({path: /a:[^:]+/}) 
{ "_id" : ObjectId("58fedc47622e89329d123ee8"), "path" : "a:b" } 
{ "_id" : ObjectId("58fedc57622e89329d123ee9"), "path" : "a:b:c" } 

> db.foo.find({path: /a:[a-z]+/}) 
{ "_id" : ObjectId("58fedc47622e89329d123ee8"), "path" : "a:b" } 
{ "_id" : ObjectId("58fedc57622e89329d123ee9"), "path" : "a:b:c" } 

Rõ ràng regex /a:[^:]+//a:[a-z]+/ không nên phù hợp với chuỗi 'a:b:c', nhưng trông giống như Mông Cổ thất bại trên regex này, không ai biết chuyện gì xảy ra ở đây?

Nó đã được gửi đến MongoDB Jira, as a bug ticket, do đó, nó là một lỗi trong cấu trúc truy vấn MongoDB?

Trả lời

8

Sự cố là với kết hợp từng phần, vì bạn không hạn chế regex cho toàn bộ từ, kết hợp từng phần tồn tại trong a:b:ca:b là kết quả bạn nhận được tài liệu đó.

Sử dụng regex sau đây với ^$ là các neo đại diện cho bắt đầu và kết thúc của từ;

db.foo.find({path: /^a:[^:]+$/}) 
db.foo.find({path: /^a:[a-z]+$/}) 

Điều này sẽ làm cho regex áp dụng cho toàn bộ chuỗi và bỏ qua các phần khớp như được giải thích ở trên. Để biết thêm về neo regex, click here.

Vì vậy, tóm lại, không có lỗi, chỉ là lạm dụng regex.

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