我的数据库结构
{
"Author_Name" : "mukund",
"Quote_Details" : [
{
"Quote_Text" : "Lost in the woods",
"Quote_Catagory" : "Something",
"Quote_Time" : "systime",
"Occassion" : "some time",
"Said_TO" : "somebody"
},
{
"Quote_Text" : "Miles to go before i sleep",
"Quote_Catagory" : "Nothing",
"Quote_Time" : "besttime",
"Occassion" : "i dont know",
"Said_TO" : "Nobody"
}
],
"_id" : ObjectId("535f6dc8b8082fd3f80dea0f")
}
我的PHP代码
$query = $collection->find(array("Quote_Details.Quote_Text" => new MongoRegex("/^$q/i"),"Author_Name" => "$author"));
$json2 = array();
foreach($query as $result)
{
//echo $result['Quote']."\n" ;
$json2[]= array('val'=>$result["Author_Name"],
'value'=>$result["Quote_Details.Quote_Text"]);
}
echo json_encode($json2);
我认为这是有效的,因为当我得到一个值为null时,只有' value'在我输入正确值的文本框中。当我提供q作为"迷失在树林里时,我得到正确的作者姓名"和author_name为" mukund",但取代了'值'它显示为null
还有一点需要注意的是,如果我为q添加任何其他值,则根据需要不输出
控制台输出
[{"val":"mukund","value":null}]
请告诉我我在这里做错了什么
答案 0 :(得分:2)
因此,代码的问题在于,当您确实需要使用PHP表示法时,您仍在尝试使用JSON表示法来访问内部文档。由于您的PHP表示法不匹配任何内容,因此您将得到null结果。
但实际上,这不是您想要做的,因为您在代码中处理结果。您可以非常轻松地完成此服务器端:
$result = $collection->aggregate(array(
array(
'$match' => array(
'Quote_Details.Quote_Text' => MongoRegex("/^$q/i"),
'Author_Name' => "$author"
)
),
array(
'$unwind' => '$Quote_Details'
),
array(
'$project' => array(
'_id' => 0,
'val' => '$Author_Name',
'value' => '$Quote_Details.Quote_Text'
)
)
));
echo json_encode( $result['result'], JSON_PRETTY_PRINT ) . "\n";
现在,如图所示,您不再需要迭代结果,因为您可以在现场进行编码,并且您已经在结果中重新塑造了您想要的结果。
答案 1 :(得分:1)
根据我的理解,您的收藏是多维的(文档和子文档)。 所以,你可能会得到"值"结果如下代码:
而不是使用:
$result["Quote_Details.Quote_Text"]
在foreach循环中
改为使用:
$result["Quote_Details"]["Quote_Text"]
上面的代码为您提供输出:
[{"val":"mukund","value":"Lost in the woods"}]