4.5. 数据位于集合中时的集成行为
有时,连接会返回一个集合,其中包含所有相同类型的多个值。当连接返回集合时,流可以通过多种方式在集合上运行,包括:
- 为集合执行一次每个步骤。
- 对集合中的每个元素执行一次。
- 对集合执行一些步骤,并对集合中的每个元素执行一次其他步骤。
要确定如何在流中的集合上运行,您需要知道流连接到哪些应用程序、它们是否可以处理集合,以及您希望流完成的内容。然后,您可以使用以下主题中的信息在处理集合的流中添加步骤:
4.5.1. 关于数据类型和集合
数据映射器显示源字段和目标字段,并定义您需要的字段映射。
在数据映射程序中,字段可以是:
-
存储单个值的 原语 类型。原语类型的示例包括
布尔值
、char
、字节
、短语、int
、长
、浮点
和双引号
。原语类型无法扩展,因为它是一个字段。
- 由不同类型的多个字段组成 的复杂 类型。您可以在设计时定义复杂类型的子字段。在数据映射程序中,一个复杂的类型可以被扩展,以便您可以查看其子字段。
每种类型的字段(原语和复杂)也可以是集合。集合是一个可以具有多个值的单个字段。集合中的项目数量在运行时决定。在设计时,在数据映射程序中,集合由 表示。在数据映射程序界面中可以扩展集合是否由其类型决定。当集合是一个原语类型时,它不可扩展。当集合是一个复杂的类型时,数据映射程序可以被扩展,以显示集合的子字段。您可以从/到每个字段映射。
以下是一些示例:
-
ID
是原语类型字段(int
)。在运行时,员工只能有一个ID
。例如,ID=823
。因此,ID
是不是集合的原语类型。在数据映射程序中,ID
无法扩展。 -
电子邮件
是一个原语类型字段(字符串)。在运行时,员工可以有多个电子邮件
值。例如,电子邮件<0>=aslan@home.com
和email<1>=aslan@business.com
。因此,电子邮件
也是集合的原语类型。数据映射程序使用 表示电子邮件
字段是一个集合,但电子邮件
无法扩展,因为它是一个原语类型(没有子字段)。 -
员工
是一个复杂的对象字段,它具有多个子字段,包括ID
和电子邮件
。在运行时,员工
也是集合,因为公司有许多员工。
在设计时,数据映射程序使用 来表示员工
是一个集合。employee
字段可以扩展,因为它是一个具有子字段的复杂类型。
4.5.2. 关于处理集合
处理集合的过程的最简单方法是使用数据映射器将源集合中的字段映射到目标集合中的字段。对于许多流,这都是需要的。例如,流可能会从数据库获取一组员工记录,然后将这些记录插入到电子表格中。在数据库连接和 Google Sheets 连接之间,数据映射器步骤会将数据库字段映射到 Google Sheets 字段。由于源和目标都是集合,因此当 Fuse Online 执行流时,它将调用 Google Sheets 连接一次。在该调用中,Fuse Online 会迭代记录并正确填充电子表格。
在某些流中,您可能需要将集合分成单独的对象。例如,假设一个流连接到一个数据库,并获取一组员工,如果这些员工在特定日期之前不使用此时间,则这些员工将丢失。然后,流程需要向这些员工发送电子邮件通知。在此流中,您将在数据库连接后添加分割步骤。然后,您将添加一个数据映射程序步骤,它将员工记录的 source 字段映射到发送消息的 Gmail 连接中的 target 字段。当 Fuse Online 执行流时,它会为每个员工执行数据映射程序步骤以及 Gmail 连接一次。
有时,在分割流中的集合后,以及对集合中的每一元素执行一次步骤后,您希望流再次对集合操作。考虑前面段落中的示例。假设 Gmail 连接在向每个员工发送电子邮件后,您想要添加通知给电子表格的员工列表。在这种情况下,在 Gmail 连接后,添加一个聚合步骤来创建一组员工名称。然后,添加一个数据映射器步骤,将源集合中的字段映射到目标 Google Sheets 连接中的字段。当 Fuse Online 执行流时,它会执行新的数据映射程序步骤,以及一次 Google Sheets 连接。
这些是在流中处理集合的最常见场景。但是,也可以进行更复杂的处理。例如,当集合中的元素本身是集合时,您可以在其他分割和聚合步骤中嵌套并汇总步骤。
4.5.3. 使用数据映射器来处理集合
在流中,当步骤输出集合以及流中的后续连接时,您可以使用数据映射器来指定流如何处理集合。
当步骤输出集合时,流程视觉化会在步骤的详情中显示 Collection。例如:
在提供集合的步骤后添加数据映射程序步骤,并在需要映射的步骤之前添加。准确在这个数据映射程序步骤中,需要依赖于流程中的其他步骤。下图显示了从源集合字段到目标集合字段的映射:
在源和目标面板中,数据映射器会显示 来表示集合。
当集合是一个复杂的类型时,数据映射器会显示集合的子字段。您可以从/到每个字段映射。
当 source 字段嵌套在多个集合中时,您可以将其映射到满足其中一个条件的目标字段:
target 字段嵌套在与 source 字段相同的集合数量中。例如,允许这些映射:
-
/A<>/B<>/C
/D<>/E<>/F -
/A<>/B<>/C
/G<>/H/I<>/J
-
/A<>/B<>/C
target 字段仅嵌套在一个集合中。例如,允许这个映射:
/A<>/B<>/C
/K<>/L 在这种情况下,数据映射器使用深度优先算法来迭代源中的所有值。因此,数据映射程序会将源值放入单个目标集合中。
不允许以下映射:
/a<>/B<>/C cannot-map-to /M<>/N/O<>/P<>/Q
当 Fuse Online 执行流时,它会迭代源集合元素来填充目标集合元素。如果您将一个或多个源集合字段映射到目标集合字段或目标集合字段,则目标集合元素仅包含映射字段的值。
如果您将源集合中的字段映射到不在集合中的 target 字段,那么当 Fuse Online 执行流时,它将只分配源集合中最后一个元素的值。该映射步骤中会忽略集合中的任何其他元素。但是,任何后续映射步骤都可以访问源集合中的所有元素。
当连接返回 JSON 或 Java 文档中定义的集合时,数据映射器通常可以将源文档处理为集合。
4.5.4. 添加分割步骤
在执行流期间,当连接返回对象集合时,Fuse Online 会为集合执行后续步骤。如果要对集合中的每个对象执行一次后续步骤,请添加分割步骤。例如,Google Sheets 连接返回一系列行对象。要为每个行执行后续步骤,请在 Google Sheets 连接后添加拆分步骤。
确保到分割步骤的输入始终是一个集合。如果分割步骤获得一个不是集合类型的源文档,则步骤会分割每个空格的输入。例如,Fuse Online 将"Hello world!"输入分成两个元素:"Hello"和"world!",并将这两个元素传递给流中的下一步。特别是,XML 数据不是集合类型。
先决条件
- 您正在创建或编辑流。
- 流已具有需要的所有连接。
- 在流视觉化中,获取源数据的连接表示数据是一个 (Collection)。
步骤
- 在流视觉化中,点您要添加分割步骤的位置 。
- 单击 Split。此步骤不需要任何配置。
- 点 Next。
附加信息
通常,您要在添加数据映射程序步骤前添加任何分割步骤和聚合步骤。这是因为数据是集合还是单个对象会影响映射。如果您添加了数据映射程序步骤,然后添加分割步骤,则通常需要重做映射。同样,如果您删除了分割或聚合步骤,则需要重做任何映射。
4.5.5. 添加聚合步骤
在流中,添加一个聚合步骤,其中您希望 Fuse Online 从单个对象创建集合。在执行聚合步骤后,在聚合步骤后,Fuse Online 会对每个对象执行一次后续步骤。
在决定是否为流中添加聚合步骤时,请考虑流中的连接。在分割步骤后,对于后续连接,Fuse Online 会针对流数据中的每个元素连接到该应用程序。对于某些连接,最好连接一次,而不是多次。
先决条件
- 您正在创建或编辑流。
- 流已具有需要的所有连接。
- 上一步将集合分成单独的对象。
步骤
- 在流视觉化中,您要在流中添加聚合步骤,点 。
- 单击 Aggregate。此步骤不需要任何配置。
- 点 Next。
附加信息
通常,您要在添加数据映射程序步骤前添加任何分割和聚合步骤。这是因为数据是集合还是单个对象会影响映射。如果您添加了数据映射程序步骤,然后添加聚合步骤,则通常需要重做映射。同样,如果您删除了聚合步骤,则需要重做任何映射。
4.5.6. 在流中处理集合示例
这个简单集成从 Fuse Online 提供的示例数据库中获取一系列任务。流将集合分成单独的任务对象,然后过滤这些对象以查找已完成的任务。然后,流聚合集合中完成的任务,将该集合中的字段映射到电子表格中的字段,并通过向电子表格中添加完成的任务列表来完成。
以下流程提供了创建此简单集成的说明。
先决条件
- 您创建了 Google Sheets 连接。
- 在 Google Sheets 连接访问的帐户中,有一个接收数据库记录的电子表格。
步骤
- 点 Create Integration。
添加启动连接:
- 在 Choose a connection 页面上,单击 PostgresDB。
- 在 Choose an action 页面中,选择 Periodic SQL Invocation。
-
在 SQL Statement 字段中,输入
select * from todo
并点 Next。
此连接返回任务对象的集合。
添加完成连接:
- 在 Choose a connection 页面中,点 Google Sheets 连接。
- 在 Choose an action 页面上,选择 Append values to a sheet。
- 在 SpreadsheetId 字段中,输入电子表格的 ID,以将任务列表添加到其中。
-
在 Range 字段中,输入
A:B
作为您要附加值的目标列。第一列 A 用于任务 ID。第二列 B 用于任务名称。 - 接受 Major Dimension 和 Value Input Option 的默认值,然后单击 Next。
Google Sheets 连接通过将集合中的每个元素添加到电子表格来完成流。
在流中添加分割步骤:
- 在流视觉化中,点加号。
- 单击 Split。
在流程执行分割步骤后,结果是一组单独的任务对象。Fuse Online 为每个单个任务对象执行一次流程中的后续步骤。
在流中添加过滤器步骤:
- 在流视觉化中,在分割步骤后点加号。
点击 Basic Filter 并配置过滤器,如下所示:
-
点击第一个字段并选择
completed
,这是包含您要评估的数据的字段名称。 - 在第二个字段中,选择 等于 为 完成 字段值必须满足的条件。
-
在第三个字段中,指定
1
作为必须在 完成字段中的值。1
表示该任务已完成。
-
点击第一个字段并选择
- 点 Next。
在执行期间,流为每个任务对象执行一次过滤器步骤。结果是一组单独的完成的任务对象。
在流中添加聚合步骤:
- 在流视觉化中,在过滤步骤后点加号。
- 单击 Aggregate。
现在,结果集包含一个集合,其中包含每个完成的任务的一个元素。
在流中添加数据映射程序步骤:
- 在流视觉化中,在聚合步骤后点加号。
点 Data Mapper,将 SQL 结果源集合中的以下字段映射到 Google Sheets 目标集合中:
- ID 到 A
- 任务 到 B
- 点 Done。
- 单击 Publish。
结果
当集成运行时,它会每分钟从示例数据库中获取任务,然后将完成的任务添加到电子表格中的第一表格中。集成将任务 ID 映射到第一列 A,并将任务名称映射到第二列 B。