尝试使用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 :(得分: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;
}