2012-05-14 28 views
5

->Xin xem cập nhật ở phía dưới, tôi đã nhân rộng cùng một vấn đề trong Mongo shellphp Mongo tìm thấy chỉ sử dụng 4 tiêu chí

tiêu chí của tôi đang được truyền qua các tham số GET và được đặt vào $ data (như một mảng assc). Sau đó, nó sẽ đến phần dưới đây, trong đó mỗi cụm từ tìm kiếm trở thành một phần không khớp chính xác. Sau đó, chúng tôi loại bỏ (bỏ đặt) tiêu chí rỗng.

Tổng cộng có thể có 15 trường có ít nhất 1 và tối đa 15 trường có thể được đặt.

foreach ($data as $k => $v) { 
    // Make them partial match 
    $data[$k] = new MongoRegex('/'.$v.'/i'); 
    // Remove empty criteria 
    if (empty($v)) unset($data[$k]); 
} 
// Run the search 
$cursor = $this->collection->find($data); 

Mọi thứ hoạt động ngọt miễn là tiêu chí thông qua 4 hoặc ít hơn như:

Array ( 
    [phone] => MongoRegex Object ([regex] => 433 [flags] => i) 
    [property_name] => MongoRegex Object ([regex] => west [flags] => i) 
    [city] => MongoRegex Object ([regex] => H [flags] => i) 
    [zip_postcode] => MongoRegex Object ([regex] => 9 [flags] => i) 
) 

này trả về 5 kết quả.

Nhưng bất kỳ tiêu chí nào được thêm sau lần thứ 4 đều không hiệu quả.

Array ( 
    [phone] => MongoRegex Object ([regex] => 433 [flags] => i) 
    [state_province] => MongoRegex Object ([regex] => Virginia [flags] => i) 
    [property_name] => MongoRegex Object ([regex] => west [flags] => i) 
    [city] => MongoRegex Object ([regex] => H [flags] => i) 
    [zip_postcode] => MongoRegex Object ([regex] => 9 [flags] => i) 
) 

này sẽ trả về 2 nhưng vẫn trả 5 và nó sẽ trở lại 5 dù có bao nhiêu tiêu chí ghi được thêm

- Cập nhật -

Vì vậy, tôi đã cố gắng nó trong Shell và sự ngạc nhiên của tôi nó cũng không hoạt động ở đó.

db.property_list.find({phone:/433/, property_name:/west/, city:/h/, zip_postcode:/9/}).count() 

lợi nhuận 5

Bây giờ khi tôi thêm tham số 5 nó nên thu hẹp kết quả đến 2 nhưng nó là không hiệu quả và vẫn hiển thị tính là 5 !!!

db.property_list.find({phone:/433/, property_name:/west/, city:/h/, zip_postcode:/9/, state_province:/Virginia/}).count() 

lợi nhuận 5

Với rất nhiều các thí nghiệm, tôi nhận ra nó chỉ là 4 tiêu chí đầu tiên được vớt lên !! Giống như trong ví dụ cuối cùng tôi chuyển vị trí cho 'state_province''city' nó sẽ là tiêu chí 'thành phố' sẽ không hiệu quả vì nó sẽ là tiêu chí thứ 5 !!

- New Update -

Hóa ra nếu tôi sử dụng kết hợp bình thường thay vì regex trên các tiêu chí thứ 5 nó sẽ làm việc. Tôi có đúng để giả định Mongo có thể tìm thấy() chỉ cho 4 tiêu chí regex không? Vì vậy, đây sẽ đúng lợi nhuận 1

db.property_list.find({phone:/433/, property_name:/west/, city:/h/, zip_postcode:/9/, state_province:Virginia}).count() 
+0

Điều tương tự cũng xảy ra nếu bạn chỉ có "state_province"?Bạn có thể sao chép điều này trên vỏ Mongo không? – Derick

+0

Hey Derick, cảm ơn câu trả lời của bạn, tôi đã thử nó cũng trong vỏ Mongo và ngạc nhiên của tôi vẫn còn cùng một vấn đề ... Tôi gần như chắc chắn rằng Mongo không hạn chế các tiêu chí regex đến 4? !! – Zoheir

Trả lời

2

Có một giới hạn cứng của 4 tiêu chí regex cho phép mỗi truy vấn. Nó đã được cố định trong mã lõi Mongo khoảng sáu tháng trước: https://github.com/mongodb/mongo/commit/62554d064a264f9b6c28099ba71421f250bbbba9

Dường như sửa chữa này chưa được kéo vào 1.8 hoặc 2.0 chi nhánh của Mongo chưa, đây là chi nhánh v1.8 cho thấy giới hạn cứng: https://github.com/mongodb/mongo/blob/v1.8/db/matcher.cpp#L159

+0

Cảm ơn SteveK! Nhưng có vẻ như nó cũng chưa được sửa trong các phiên bản sau: – Zoheir

+0

Ahh, bạn nói đúng, nó đã được sửa trong nhánh master (http://bit.ly/Kbjfeh) nhưng chưa có trong v2.0 (http : //bit.ly/Kbjm9M). Trong thực tế, chi nhánh v2.0 vẫn còn khá nhiều cách đằng sau master (http://bit.ly/KbjrtT). Có vẻ như bạn sẽ cần phải tìm một cách khác xung quanh vấn đề này. Btw, tôi đã cố gắng để tái tạo vấn đề này trên DB của tôi, nhưng ngay cả khi sử dụng regex trên các lĩnh vực được lập chỉ mục, 4 thành phần regex làm cho nó rất chậm mà tôi không thể dễ dàng có được một so sánh: P – SteveK

+0

Tôi đã có thể tái sản xuất nó. Kiểm tra mongodb.log của bạn, bạn sẽ thấy điều này: 'Thứ Hai 14 tháng 5 22:02:30 [conn290] L ERI: quá nhiều regex trong truy vấn ' – SteveK

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