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


how to select subdocuments from mongodb and store it in an array, then display it?

我的数据库结构

{
"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);

我认为它是有效的,因为当我输入正确的值时,文本框中只有"value"的值为null。当提供q为"迷失在森林中"和author_name为"mukund"时,我得到了正确的作者名称,但在"value"的位置,它显示为空

需要注意的一点是,如果我为q设置任何其他值,则根据需要不会获得输出

控制台输出为

[{"val":"mukund","value":null}]

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

因此,代码的问题在于,当您实际需要使用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";

因此,现在,如图所示,您不再需要迭代结果,因为您只需当场编码,并且您已经将结果重新调整为您想要的结果。

根据我的理解,您的集合是多维的(文档和子文档(。因此,您可以通过以下代码获得结果中的"值":

而不是使用:

$result["Quote_Details.Quote_Text"] 

在foreach循环中

改为使用这个:

$result["Quote_Details"]["Quote_Text"]

上面的代码将输出为:

[{"val":"mukund","value":"Lost in the woods"}]