结合'$ or'和daterange

时间:2013-08-05 23:42:43

标签: mongodb mongodb-php

尝试使用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
                                )

                        )

                )

        )

)

我不应该以这种方式结合这些条件吗?

3 个答案:

答案 0 :(得分: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(,将]}更改为)

答案 1 :(得分:0)

$or采用数组(在常识中,不是PHP意义上的;哈希映射无效)。

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包含一系列条件,而不是散列映射。

答案 2 :(得分: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;    
}