You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何合并同ParentId的Salesforce Files为单个负载并批量处理?

解决方案:合并同一ParentId的Salesforce Files为单个负载

首先先明确个细节:Salesforce里的“文件”核心对象是ContentDocument,而文件与业务记录的关联通常通过ContentDocumentLink实现(一个文件可以关联到多个记录)。如果你的查询直接依赖ContentDocument.ParentId,可能会遗漏部分关联文件,建议优先通过ContentDocumentLink来查询目标记录下的所有文件——这点先提出来避坑。

接下来分两种场景给你具体实现方案:

一、处理单个ParentId的文件合并(对应你当前的单ParentId查询场景)

如果你用的是Salesforce Flow(从你提到的flowVars.ParentId来看,大概率是Flow):

  • 步骤1:收集查询结果到集合变量
    创建一个集合变量,类型选择ContentDocument(或ContentDocumentLink,取决于你的查询对象),把查询到的所有文件记录赋值给这个集合。
  • 步骤2:创建自定义数据类型承载合并负载
    新建一个自定义数据类型,添加两个字段:ParentId(类型为ID/文本)和AttachedFiles(类型为集合,对应ContentDocument)。这个类型就是你要的“单个负载”的结构。
  • 步骤3:打包成单个负载
    新建一个该自定义数据类型的变量,把当前的#[flowVars.ParentId]赋值给ParentId字段,把步骤1的集合赋值给AttachedFiles字段。这样就得到了包含该ParentId下所有文件的单负载。

如果你用的是Apex代码:

直接把查询到的文件列表和ParentId打包成你需要的格式即可,比如JSON:

// 假设已查询到当前ParentId的所有文件
List<ContentDocument> targetFiles = [SELECT Id, Title, ContentSize FROM ContentDocument WHERE ParentId = :flowVars_ParentId];

// 打包成单个负载
Map<String, Object> mergedPayload = new Map<String, Object>{
    'ParentId' => flowVars_ParentId,
    'Files' => targetFiles
};
// 转成JSON字符串(如果需要对外传输的话)
String payloadJson = JSON.serialize(mergedPayload);

二、批量处理多个ParentId的场景(后续要处理其他带文件的ParentId)

Flow方案:

  • 步骤1:获取所有需要处理的ParentId列表
    先查询出所有需要处理的记录ID(比如从自定义对象、批量导入列表中获取),存入集合变量TargetParentIds
  • 步骤2:循环遍历每个ParentId
    添加一个循环元素,遍历TargetParentIds集合。
  • 步骤3:单ParentId处理+负载收集
    在循环内部,执行单个ParentId的文件查询和合并操作(参考上面的单个场景步骤),然后把生成的合并负载添加到一个负载集合变量里。
  • 步骤4:批量处理所有负载
    循环结束后,你会得到一个包含所有ParentId对应合并负载的集合,可以统一进行后续操作(比如调用外部API、存入数据库等)。

Apex方案:

Map<Id, List<ContentDocument>>按ParentId分组文件,效率更高:

// 定义所有需要处理的ParentId列表
Set<Id> targetParentIds = new Set<Id>{'id1', 'id2', 'id3'}; // 替换成你的实际ID集合

// 查询所有关联文件(通过ContentDocumentLink确保获取全量关联文件)
List<ContentDocumentLink> cdlList = [
    SELECT LinkedEntityId, ContentDocumentId, ContentDocument.Title, ContentDocument.ContentSize
    FROM ContentDocumentLink
    WHERE LinkedEntityId IN :targetParentIds AND ShareType != 'I' // 排除内部私有链接
];

// 按ParentId分组文件
Map<Id, List<ContentDocument>> parentToFilesMap = new Map<Id, List<ContentDocument>>();
for(ContentDocumentLink cdl : cdlList) {
    Id parentId = cdl.LinkedEntityId;
    if(!parentToFilesMap.containsKey(parentId)) {
        parentToFilesMap.put(parentId, new List<ContentDocument>());
    }
    parentToFilesMap.get(parentId).add(cdl.ContentDocument);
}

// 生成所有ParentId的合并负载集合
List<Object> allPayloads = new List<Object>();
for(Id parentId : parentToFilesMap.keySet()) {
    allPayloads.add(new Map<String, Object>{
        'ParentId' => parentId,
        'Files' => parentToFilesMap.get(parentId)
    });
}

// 后续统一处理allPayloads集合即可

关键注意点

  • 若之前的查询直接用ContentDocument.ParentId,可能会漏掉通过ContentDocumentLink关联但ContentDocument.ParentId为空的文件,建议用ContentDocumentLink查询更准确。
  • 在Flow里处理大数量文件时,注意不要触发元素数量限制,可考虑用Fast Lookup优化查询效率。

内容的提问来源于stack exchange,提问作者Saravanan Sivalingam

火山引擎 最新活动