这个mongodb查询可以正确返回具有匹配子文档条件的文档
db.user.find(
{Type: {"$in": ["local","google"]},
Alerts:{$elemMatch:{"Frequency.Type":"daily","IsActive":true}}
})
当我把它转换成php数组时它什么也没有返回
$qry = array("Type"=>array('$in'=>array("local","google")),
array('Alerts'=>array('$elemMatch'=>array('Frequency.Type'=>'daily','IsActive'=>true))));
这是文档的结构
{
"Email" : "someemail@domain.com",
"Type" : "confirmed",
"FName" : "Sung",
"Alerts" : [
{
"Keyword" : "administrative",
"Frequency" : {
"Type" : "weekly"
}
"IsActive" : true
},
{
"Keyword" : "marketing",
"Frequency" : {
"Type" : "daily"
}
"IsActive" : true
}
]
}
当我从php数组中取出elemMatch部分时,它返回行。所以我在连接,那里有数据。不确定是否我编码的数组正确,但我认为$elemMatch不支持正确的php mongodb库。聚合不是一个选项。我需要一个游标,因为这将返回大数据集,不想崩溃的服务器。搜索了web,无法找到$elemMatch mongodb查询在php中完成的工作示例。
您的数组多了一个。
$qry = array(
"Type"=>array('$in'=>array("local","google")),
"Alerts"=>array('$elemMatch'=>array(
"Frequency.Type"=> "daily",'IsActive'=>true
))
);
以后,试着像我这样缩进你的代码,这样你就能清楚地看到结构。此外,由于您正在比较已知的JSON结构,因此请执行以下操作:
echo json_encode( $qry, JSON_PRETTY_PRINT ) ."n";
然后您可以清楚地看到您所做的与预期输出不匹配的内容。
BTW -如果你有一个JSON格式的查询,你知道工作,你只是想把它进入PHP,你可以使用PHP的json_decode
和var_export
转换你的(有效的)JSON查询到PHP查询。
var_export(json_decode(
'{
"Type": {"$in": ["local","google"]},
"Alerts":{ "$elemMatch": {"Frequency.Type":"daily","IsActive":true}}
}',true));
和输出(删除一些空白后,因为var_export
的输出是糟糕的空白)看起来像这样:
array (
'Type' => array ( '$in' => array ( 0 => 'local', 1 => 'google', ), ),
'Alerts' => array ( '$elemMatch' => array (
'Frequency.Type' => 'daily',
'IsActive' => true,
), ),
)
(您可能还希望删除编号索引)。
我有非常类似的问题。文档结构:
[
{
"locale":"en",
"translations":[
{
"name":"translation1",
"value":"enValue"
},
{
"name":"translation2",
"value":"enValue"
},
{
"name":"translation3",
"value":"enValue"
}
]
},
{
"locale":"ru",
"translations":[
{
"name":"translation1",
"value":"ruValue"
},
{
"name":"translation2",
"value":"ruValue"
},
{
"name":"translation3",
"value":"ruValue"
}
]
}
]
代码:/** @var BSONDocument|null $result */
$result = $collection->findOne(
[
'locale' => ['$eq' => $locale],
'translations' => ['$elemMatch' => ['name' => 'translation1']]
]
);
dd(json_encode($result->getArrayCopy()));
json编码的结果是:
{
"_id": {
"$oid": "5e988dda2566154a5a442a53"
},
"locale": "en",
"translations": [
{
"name": "translation1",
"value": "translation222 value for en"
},
{
"name": "translation2",
"value": "translation222 value for en"
},
{
"name": "translation3",
"value": "translation 333 value for en"
}
]
}