2012-05-14 11 views
5

->Proszę zobaczyć aktualizacje na dole, mam ten sam problem replikowane w Mongo shellphp Mongo znaleźć wykorzystać tylko 4 kryteria

moich kryteriów jest przekazywane za pośrednictwem parametrów GET i zostaje umieszczony w $ dane (jako tablica assc). Następnie przechodzi do sekcji poniżej, gdzie każde wyszukiwane hasło staje się częściowe, a nie dokładne. Następnie usuwamy (usuwamy) puste kryteria.

Łącznie istnieje 15 pól, w których można ustawić co najmniej 1 i co najwyżej 15.

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); 

Wszystko działa słodki jak długo minęło charakterystyczne są 4 lub mniej jak:

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) 
) 

zwraca Ten 5 wyników.

Jednak wszystkie kryteria dodane po czwartym są nieskuteczne.

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) 
) 

ten powinien powrócić 2 ale nadal zwraca 5 i powróci 5 Nie ważne ile kryteria pozycje są dodawane

- Aktualizacja -

Więc próbowałem go w Shell i ku mojemu zdziwieniu też tam nie działa.

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

zwraca 5

Teraz po dodaniu 5th parametr powinien zawęzić wyniki do 2 ale jest nieskuteczny i nadal wykazują rachubę jako 5 !!!

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

zwraca 5

Z wielu doświadczeń, zdałem sobie sprawę, że jest tylko pierwsze 4 Kryteria czym podniósł !! Tak jakby w ostatnim przykładzie zmieniłem miejsce na 'state_province' i 'city' będzie to kryterium "miasta", które będzie nieskuteczne, ponieważ będzie to 5 kryterium!

- Nowa aktualizacja -

Okazuje się, jeśli mogę użyć zamiast normalnego meczu regex na 5 kryteriów będzie działać. Czy mam rację, zakładając, że Mongo może znaleźć find() tylko dla 4 kryteriów wyrażeń regularnych? Więc to poprawnie zwraca 1

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

Czy to samo dzieje się, jeśli po prostu masz "state_province"?Czy możesz powtórzyć to w powłoce Mongo? – Derick

+0

Hej, Derick, dziękuję za odpowiedź, próbowałem go również w powłoce Mongo i ku mojemu zdziwieniu wciąż ten sam problem ... Jestem prawie pewien, że Mongo nie ogranicza kryteriów regex do 4? !! – Zoheir

Odpowiedz

2

Jest twardy limit 4 dozwolonych kryteriów regex na zapytania. Została ona ustalona w kodzie rdzeń Mongo około sześć miesięcy temu: https://github.com/mongodb/mongo/commit/62554d064a264f9b6c28099ba71421f250bbbba9

to wygląda ta poprawka nie została wciągnięta do 1,8 lub 2,0 gałęziach Mongo jeszcze, oto gałęzi v1.8 pokazując sztywny limit: https://github.com/mongodb/mongo/blob/v1.8/db/matcher.cpp#L159

+0

Dzięki SteveK! Wygląda jednak na to, że nie zostało to również naprawione w późniejszych wersjach: – Zoheir

+0

Ahh, masz rację, jest naprawiony w głównej gałęzi (http://bit.ly/Kbjfeh), ale jeszcze nie w wersji 2.0 (http : //bit.ly/Kbjm9M). W rzeczywistości gałąź v2.0 jest wciąż dość droga do mistrza (http://bit.ly/KbjrtT). Wygląda na to, że musisz znaleźć inny sposób obejścia tego problemu. Btw, próbowałem odtworzyć ten problem na moim DB, ale nawet przy użyciu regex na indeksowane pola, 4 elementy regex sprawia, że ​​tak wolno, że nie mogę łatwo uzyskać porównanie: P – SteveK

+0

Byłem w stanie odtworzyć go. Sprawdź swój mongodb.log, powinieneś zobaczyć: 'Mon 14 maja 22:02:30 [conn290] BŁĄD: zbyt wiele wyrażeń w zapytaniu' – SteveK

Powiązane problemy