尝试使用 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
)
)
)
)
)
我不应该能够以这种方式组合这些条件吗?
您需要一个围绕标准的额外数组,您使用了:
'$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(
,将 ]
和 }
更改为 )
。
$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
包含一个条件数组,而不是哈希图。
您应该为索引数组分配一个键而不是变量。例如:
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;
}