Laravel-mongodb空集合插入报$documents is empty错误如何解决
问题根因
报错直接原因是调用LabelDataTemporary::insert()时传入的$old_label_data_array是空数组,jenssegers/Laravel-MongoDB的insert方法底层对应MongoDB扩展的InsertMany操作,该操作原生不允许传入空文档集合,会直接抛出InvalidArgumentException,也就是你看到的$documents is empty错误。
逻辑漏洞说明
你的代码存在两个逻辑误区:
- 仅通过
$label_data_temporary_count判断集合是否为空,完全没有对待插入的$old_label_data_array做非空校验,默认只要集合为空,待插入数据就一定有值,这个假设不成立。 - 两个分支最终都会执行插入操作,走else分支时集合存在存量数据,说明此前已经完成过有效数据插入,此时
$old_label_data_array必然是有内容的,所以不会触发报错;走if分支时集合为空,恰好对应你上游组装$old_label_data_array的逻辑没有拿到有效数据,传入空数组触发了底层异常。
修复方案
在执行插入逻辑前,先对待插入数组做非空校验,空数组直接跳过插入即可,修复后代码如下:
// 优先校验待插入数据合法性 if (empty($old_label_data_array)) { // 可根据业务需求加日志记录、异常抛出等逻辑 return; } if ($label_data_temporary_count == 0) { LabelDataTemporary::insert($old_label_data_array); } else { $label_data_temporary->delete(); LabelDataTemporary::insert($old_label_data_array); }
如果你的业务逻辑本身就是要全量覆盖集合内的数据,还可以把逻辑简化,不需要提前判断集合是否为空:
if (empty($old_label_data_array)) { // 待插入为空时直接清空集合即可,和原有覆盖逻辑对齐 LabelDataTemporary::truncate(); return; } LabelDataTemporary::truncate(); LabelDataTemporary::insert($old_label_data_array);
注意:MongoDB扩展层面不会自动兼容空数组插入的场景,不要依赖ORM底层做这类兼容,所有批量插入操作前都需要在业务层对待插入数据集做非空校验。
内容的提问来源于stack exchange,提问作者0Zef0
相关产品推荐
相关产品推荐

