结合“$or”和日期范围

问题描述 投票:0回答:3

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

                        )

                )

        )

)

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

php mongodb php-mongodb
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(
,将
]
}
更改为
)


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
包含一个条件数组,而不是哈希图。


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;    
}
© www.soinside.com 2019 - 2024. All rights reserved.