2013-08-05 53 views
0

,我發現了以下錯誤而嘗試使用MongoDB的PHP驅動程序與日期範圍結合「$或」: Fatal error: Uncaught exception 'MongoCursorException' with message '$and/$or/$nor must be a nonempty array' in [FILE.php]:67

這裏是我的查詢條件:

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

         ) 

       ) 

     ) 

) 

我不能以這種方式結合這些條件嗎?

回答

0

$or需要一個數組(常識,而不是PHP意義上,hashmaps無效)。

的JavaScript(/ BSON)的版本是這樣的:

$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}}, 
] 

也就是說,$or採用的標準清單,並會返回符合其中任何一個哪些文件。我正在假設你在這裏實際需要什麼,但我可能誤解了你的原始查詢。

如果您正在尋找已創建或在指定日期範圍內訪問的文件,你想要的東西,如:

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

注意$or包含標準的數組,而不是一個HashMap。

+0

$或: {創建:{$ GT:X,$ LT爲:y}},{ 訪問:{$ GT:X,$ LT爲:y}} ] 不會這一下在PHP like: array('$ or'=> array(「created」=> array('$ gt'=> x,'$ lt'=> y), 「accessible」=> array('$ gt '=> x,'$ lt'=> y)) ); –

+0

不,它不會。我在BSON演示它,這正是Mongo所說的。我之所以選擇這個,是因爲數組和哈希之間的區分[和]區別於PHP的組合語法。 –

+0

請問您可以在PHP中添加解決方案嗎? –

0

您應該將一個鍵而不是一個變量分配給索引數組。例如:

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

您需要周圍的標準進行額外的數組,你使用:

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

但你需要的是:

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

$or接受一個array,而不是一個associative array 。在PHP中,這些語法的語法與array()相同,在JavaScript/JSON中,其格式爲[..]{..}。在PHP中,區別在於您是否擁有數字(或沒有任何關鍵字)或字符串作爲關鍵字(created/accessed)作爲最高級別。

將JSON/BSON查詢語法轉換成PHP並不是那麼困難,我建議你做一些研究如何做到這一點。它基本上是指:將[{更改爲array(,並將]}更改爲)