2011-05-14 16 views
5

arama nasıl yapılır - örneğin John Smith veya John Henry Harry Smith eşleşecektir sqlyapmak YA ben kısmi ve soyadınız maç aramak istediğiniz

f_name LIKE J% OR l_name LIKE S% 

içinde. Ben "$ veya" operatörü kullanmanız gerekebilir varsayıyorum

,

Ben daha düzgün GİBİ% parçasını yapıyor inanıyoruz bu var, ama bir "AND" araması yapıyor inanıyoruz (o anlamına f_name gİBİ J% arar ve sadece John Smith eşleşir, böylece LIKE S% L_NAME):

$name1="J"; 
$name2="S"; 
$cursor = $this->clientCollection->find(array('f_name' => new MongoRegex('/^'.$name1.'/i'), 'l_name' => new MongoRegex('/^'.$name2.'/i'))); 

Not: Bu

MongoRegex('/'.$name1.'/i') 

Bu olacak J%% olarak ihtiva eden eşleşir eşleşme ile başlar

array('$or' => array(
    array('f_name' => new MongoRegex('/'.$name1.'/i')), 
    array('l_name' => new MongoRegex('/'.$name2.'/i')) 
)); 

Düzenleme: temelde sadece mevcut sorguya etrafında başka bir diziyi sarmak gerekir böylece J% olarak olarak (fark^eklendi)

MongoRegex('/^'.$name1.'/i') 

cevap

2

$or, hükümlerin dizisini alır Önceki örneği array() çağrılarının iç setini kaçırdı.

ben yayınlanmıştır orijinal, yanlış, örnek şuna benziyordu:

array('$or' => array(
    'f_name' => new MongoRegex('/'.$name1.'/i'), 
    'l_name' => new MongoRegex('/'.$name2.'/i') 
)); 

Bu, geçerli bir sorgu değil, yararlı bir tanesidir. Aslında, f_name ve l_name10 sorgu bölümleri hala ANDed'dir, bu nedenle $or bölümü işe yaramaz (yalnızca bir sorguyu aşmaktadır, bu nedenle bu sorguyu kendi başına çalıştırmasıyla aynıdır).

Yorumunuzda bahsettiğiniz alternatife gelince, bir sorgudaki en dıştaki dizinin ilişkilendirici bir dizi olması gerektiğinden çalışmaz. Karışıklık, Mongo'nun sorgu sözdiziminin JSON benzeri olduğu ve nesne ve dizilerden oluşan bir karışım kullandığı için ortaya çıkar, ancak bu yapıların her ikisi de PHP tarafından dizilerle temsil edilir. PHP Mongo sürücüsü temelde PHP ilişkilendirici dizilerini JSON nesnelerine ({ ... }) ve "normal" PHP dizilerine JSON dizilerine dönüştürür ([ ... ]).

Pratik "anlık" PHP dizilerinin genellikle bir alan için birden çok değer belirtilirken olduğu gibi ilişkilendirilebilir bir dizinin içinde olduğunda geçerlidir. PHP Mongo manual Aşağıdaki örnek, bir sorguda "normal" bir dizinin geçerli bir kullanımını gösterir: Bu işler

$cursor = $collection->find(array("awards" => array('$in' => array("gold", "copper")))); 
+0

, ama sadece dizi aramaların neden iç set merak ediyorum? Orijinal kod çalışır, bir AND olarak kayıtları döndürür. Kodu değiştirerek kullanmayı denedim: \t $ cursor = $ this-> clientCollection-> find (array (dizi) ('f_name' => new MongoRegex ('/' .$ name1. '/ I')), array ('l_name '=> yeni MongoRegex (' /'.$ adı2. '/ i')))); ve işe yaramıyor, ama sizin durumunuzda '$ veya' ile yapıyor. –

+0

Burada neler olduğunu açıklamaya çalıştım. Ne yazık ki, tüm bu PHP 'array()' ler, özellikle bir bakışta, PHP'de bir Mongo sorgusunda neler olduğunu anlatmak oldukça zorlaştırabilir. –