PHP 关于 MongoDB 的一些特别操作

Posted by liuxu379 on September 20, 2024

最近在做风控相关的工作,中间涉及到宽表需求,单表字段可能会有两三千字段,通过对运维、上手难度等方面考量,最终选择了 mongoDB,实际使用效果还不错,但是因为和 MySQL 还是有一定差异,所以记录一下相关操作。

删除某些字符串开头的字段

PHP 代码

$documents = PuDao::query()->where()->get();

foreach ($documents as $doc) {
    $unsetFields = [];

    // 遍历文档,找到以 `xxxx` 开头的字段
    foreach ($doc->toArray() as $key => $value) {
        if (str_starts_with($key, 'xxxx')) {
            $unsetFields[$key] = 1; // 构建 unset 的字段列表
        }
    }

    // 如果找到了字段,则执行 $unset 删除
    if (!empty($unsetFields)) {
        PuDao::where('_id', $doc->_id)
            ->update(['$unset' => $unsetFields]); // 使用 MongoDB 的 $unset 操作符
    }
}

MongoDB 命令

db.xinyongsuanli.update(
   { "rong360_52_requestId": { $exists: true } }, // 匹配所有包含该字段的文档
   { $unset: { "rong360_52_requestId": 1 } },    // 删除该字段
   { multi: true }                         // 应用到所有匹配的文档
)