0

尝试使用 MongoDB PHP 驱动程序将 '$or' 与日期范围组合时出现以下错误: 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
                                )

                        )

                )

        )

)

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

4

3 回答 3

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(,和]})

于 2013-08-06T14:16:54.477 回答
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;    
}
于 2013-08-05T23:54:46.267 回答
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包含一个条件数组,而不是哈希图。

于 2013-08-05T23:52:52.503 回答