PHP操作MongoDB游标添加id字段 适配Algolia存储要求的实现方法
PHP操作MongoDB生成Algolia要求的id字段实现方案
方法1:PHP层遍历处理(兼容性最高)
不需要修改原有查询逻辑,只需在游标转数组的环节逐行处理即可:
// 原有查询逻辑不变,拿到游标 $cursor = $collection->find($filter, $options); $algoliaRecords = []; foreach ($cursor as $doc) { // 追加id字段,值为_id的字符串格式,原有字段全部保留 $doc['id'] = (string) $doc['_id']; $algoliaRecords[] = $doc; } // 直接将$algoliaRecords传入Algolia客户端即可 // 原有json_encode逻辑也不受影响:json_encode($algoliaRecords)
如果习惯用iterator_to_array,可以搭配array_map批量处理:
$cursor = $collection->find($filter, $options); $algoliaRecords = array_map(function ($item) { $item['id'] = (string) $item['_id']; return $item; }, iterator_to_array($cursor));
如果你配置了MongoDB驱动返回stdClass对象而非数组,只需把赋值语句改为
$doc->id = (string) $doc->_id;即可。
方法2:MongoDB聚合查询直接生成(适合数据量大的场景)
直接在查询阶段通过聚合操作生成id字段,不需要PHP层遍历处理,需要MongoDB版本≥4.0:
$pipeline = [ // 原有查询条件写入$match阶段 ['$match' => $filter], // 新增id字段 ['$addFields' => [ 'id' => ['$toString' => '$_id'] ]] ]; $cursor = $collection->aggregate($pipeline); $algoliaRecords = iterator_to_array($cursor);
内容的提问来源于stack exchange,提问作者Gandalf
相关产品推荐
相关产品推荐

