PHP操作MongoDB时无法正确遍历嵌套评论数组获取评论内容
MongoDB PHP 嵌套评论数组遍历实现
结构梳理
从实际调试输出可以明确数据的嵌套层级:
- 顶层为店铺文档,内嵌
Products商品数组 - 单个商品的字段
pCOMMENTS为 BSONArray 类型 - 数组每个元素是 BSONDocument,固定携带
Comment键,其值为包含username、date、text、rating的评论对象
原代码的逻辑问题
foreach($pro as $pro1['pCOMMENTS'])语法不符合PHP遍历规则:该写法会把商品的所有属性值挨个取出,而非单独获取pCOMMENTS字段的内容- 嵌套遍历层级错位:多套了一层无意义的循环,导致无法直接定位到评论对象
- 存在冗余查询逻辑:先全量查店铺列表,再按店铺编号二次查询同集合,重复拉取数据
修正后的实现代码
$m = new MongoDB\Client("mongodb://127.0.0.1/"); $db = $m->stores; $collection = $db->storeinfo; $storez = $collection->find(["Products.pTHUMBNAIL" => $pThumb]); foreach ($storez as $stor) { $currentAFM = $stor['AFM']; $record = $collection->findOne([ "AFM" => $currentAFM, "Products.pTHUMBNAIL" => $pThumb ]); foreach ($record['Products'] as $pro) { // 跳过不匹配缩略图的商品 if ($pThumb != $pro['pTHUMBNAIL']) { continue; } echo $pro['pID'] . " "; // 直接取当前商品的所有评论集合 $commentList = $pro['pCOMMENTS']; // 遍历每个评论项 foreach ($commentList as $commentItem) { // 按要求格式输出用户名 echo $commentItem['Comment']['username'] . " | "; } } }
注意:MongoDB官方驱动返回的 BSONArray、BSONDocument 均实现了 ArrayAccess 接口,可直接用方括号语法访问内部字段,无需额外类型转换。如需处理日期字段,可对
UTCDateTime类型对象调用toDateTime()方法转换为可读的时间格式。
内容的提问来源于stack exchange,提问作者Alexandros
相关产品推荐
相关产品推荐

