此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部分时,它返回行。所以我在连接,那里有数据。不确定我是否正确编码阵列,但我认为在php mongodb库中没有正确支持$ elemMatch。聚合不是一种选择。我需要一个游标,因为这将返回大型数据集,并且不想让服务器崩溃。搜索网络,找不到在php中完成$ elemMatch mongodb查询的工作示例。
答案 0 :(得分:4)
你有一个太多的阵列。
$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";
然后你可以清楚地看到你所做的与预期输出不匹配的事情。
答案 1 :(得分:0)
顺便说一句 - 如果你有一个JSON格式的查询,你知道它可以工作而你只想把它变成PHP,你可以使用PHP的json_decode
和var_export
来转换你的(有效的)JSON查询到PHP查询。
例如,您可以使用以下代码转换上面的查询(在JSONifying之后):
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,
), ),
)
(您可能还想删除编号索引)。
答案 2 :(得分:0)
我有非常相似的问题。 文件结构:
[
{
"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"
}
]
}