2013-08-05 5 views
0

Je reçois la faute suivante en essayant de combiner « $ ou » avec plage de dates en utilisant le pilote PHP MongoDB: Fatal error: Uncaught exception 'MongoCursorException' with message '$and/$or/$nor must be a nonempty array' in [FILE.php]:67

Voici mes critères de recherche:

Array 
(
    [$and] => Array 
     (
      [0] => Array 
       (
        [fileowner] => 51f17509d5cddc2d52000000 
       ) 
      [1] => Array 
       (
        [$or] => Array 
         (
          [created] => Array 
           (
            [$gt] => 1367812800 
            [$lt] => 1367899200 
           ) 
          [accessed] => Array 
           (
            [$gt] => 1367812800 
            [$lt] => 1367899200 
           ) 

         ) 

       ) 

     ) 

) 

Ne devrais-je pas être capable de combiner ces conditions de cette façon?

Répondre

0

$or prend un tableau (dans le bon sens, pas dans le sens de PHP, les hashmaps ne sont pas valides).

Le Javascript (/ BSON) version est quelque chose comme ceci:

$or: [ 
    {created: {$gt: 1367812800}, accessed: {$gt: 1367812800}}, 
    {created: {$gt: 1367812800}, accessed: {$lt: 1367899200}}, 
    {created: {$lt: 1367899200}, accessed: {$gt: 1367812800}}, 
    {created: {$lt: 1367899200}, accessed: {$lt: 1367899200}}, 
] 

C'est, $or prend une liste de critères, et renverra les documents qui correspondent à l'un d'eux. Je fais des suppositions sur ce que vous voulez réellement ici, mais j'ai peut-être mal interprété votre requête originale.

Si vous cherchez des fichiers qui ont été créés ou accessibles dans la période donnée, vous voulez quelque chose comme:

$or: [ 
    {created: {$gt: x, $lt: y}}, 
    {accessed: {$gt: x, $lt: y}} 
] 

Notez que $or contient un tableau de critères, et non un hashmap.

+0

$ ou: [ {créé: {$ gt: x, lt $: y}}, {OBTENU: {$ gt: x, lt $: y}} ] ne serait pas ce regard dans PHP like: array ('$ or' => array ("créé" => array ('$ gt' => x, '$ lt' => y), "accédé" => array ('$ gt '=> x,' $ lt '=> y)) ); –

+0

Non, ce ne serait pas. Je le démontrais dans BSON, c'est ce que parle Mongo. J'ai choisi cela parce que sa différenciation [] et {} entre les tableaux et les hachages est plus claire que la syntaxe combinée de PHP. –

+0

pourriez-vous mettre une solution en php, s'il vous plaît –

0

Vous devez affecter une clé et non une variable au tableau d'index. Par exemple:

function getImportPostcardMerge($daily) {   
    $s_e = getSerAndEquip(); 

    $mergearr = array(); 
    foreach ($daily as $rw) {  
    foreach ($s_e as $ks => $serv) {  
     if ($rw[0] == $serv['tracking_no']) { 
     $mergePO = array_merge($rw, $serv); 
     $mergearr[$ks] = $mergePO; 
     }  
    } 
    } 
    return $mergearr;  
} 
2

Vous avez besoin d'un tableau supplémentaire autour des critères, vous avez utilisé:

'$or' => array(
    'created' => array('$gt' => 1367812800, '$lt' => 1367899200), 
    'accessed' => array('$gt' => 1367812800, '$lt' => 1367899200) 
); 

Mais ce dont vous avez besoin est:

'$or' => array(
    array('created' => array('$gt' => 1367812800, '$lt' => 1367899200)), 
    array('accessed' => array('$gt' => 1367812800, '$lt' => 1367899200)) 
); 

$or accepte un array et non un associative array . En PHP, ceux-ci ont la même syntaxe array(), où en JavaScript/JSON, il est soit [..] par rapport à {..}. En PHP, la différence réside dans le fait que vous avez des nombres (ou rien comme des clés) ou des chaînes comme des clés (created/accessed) comme niveau supérieur.

La conversion d'une syntaxe de requête JSON/BSON en PHP n'est pas vraiment difficile, et je vous suggère de faire des recherches sur la façon de procéder. Cela signifie fondamentalement: changer [ et { à array(, et ] et } à ).