如何从mongodb中选择子文档并将其存储在一个数组中,然后显示它?

时间:2014-04-30 12:38:56

标签: php mongodb aggregation-framework

我的数据库结构

{
"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}]

请告诉我我在这里做错了什么

2 个答案:

答案 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"}]