Big Objects-查询

学习目标

完成本单元后,您将能够:

  • 使用标准SOQL查询大对象。
  • 使用Async SOQL查询大对象。
  • 列出使用Async SOQL而非标准SOQL的优缺点。

SOQL和异步SOQL

可以使用SOQL或Async SOQL查询大对象。异步SOQL使用SOQL命令的子集。它是从头开始设计的,用于处理可以保存在大对象中的大量数据。由于异步SOQL查询是异步运行的,因此您不必担心查询超时。异步SOQL查询在后台运行,可以在Salesforce实体数据,标准对象,自定义对象和大对象上运行。异步SOQL通过Chatter REST API实现。

通常,当您处理大量数据时,您希望使用Async SOQL而不是标准SOQL。如果您只需要来自大对象的小数据集,或者如果您需要立即获得结果,请使用标准SOQL。异步SOQL也适用于标准和非大型自定义对象,但对这些对象的支持处于试用阶段。

请记住,虽然每个许可证都包含自定义大对象,但Async SOQL仅包含额外大对象容量的许可。在以下时间使用标准SOQL:

  • 您希望在UI中显示结果,而无需用户等待结果。
  • 您希望立即返回结果以便在Apex代码块中进行操作。
  • 您知道查询将返回少量数据。

在以下情况下使用Async SOQL:

  • 您正在查询数百万条记录。
  • 您希望确保查询完成。
  • 您不需要在索引之外进行聚合查询或过滤。
异步SOQL用例。

简而言之,Async SOQL允许您在大对象中获取数百万条记录,并将相关数据提取到可管理的工作数据集中。

如何使用SOQL查询大对象

如果您已经熟悉使用SOQL,那么您会感到宾至如归。使用标准SOQL时需要注意的事项与使用SOQL和非大对象的大对象不同。对于具有大对象的SOQL查询,您必须从索引中定义的第一个字段开始构建查询,而不跳过查询中第一个和最后一个字段之间的任何字段。因此,例如,如果索引定义了三个字段,则无法仅使用第一个和第三个字段创建查询。

您可以使用这些比较运算符 =, <, >, <=, > =, 要么 在在查询的最后一个字段上。查询中的任何先前字段只能使用=运营商。该!=, 喜欢, 不在, 排除,和 INCLUDES 运算符在涉及大对象的任何查询中都无效。

以下查询假定您有一个大对象,其中索引由其定义 Account__c, Game_Platform__c,和 Play_Date__c。此查询指定索引中的所有三个字段。在这种情况下,过滤器Play_Date__c 可以是一个范围。

SELECT Account__c, Game_Platform__c, Play_Date__c
FROM Customer_Interaction__b
WHERE Account__c='001R000000302D3' AND Game_Platform__c='PC' AND Play_Date__c=2017-09-06T00:00:00Z

查询不起作用,因为查询中的间隙在哪里 Game_Platform__c 应该。

SELECT Account__c, Game_Platform__c, Play_Date__c
FROM Customer_Interaction__b
WHERE Account__c='001R000000302D3' AND Play_Date__c=2017-09-06T00:00:00Z

如何使用异步SOQL查询大对象

有两种主要方法可以使用Async SOQL从大对象中获取可管理的数据集。首先是使用过滤。您可以使用过滤将大对象数据的一小部分提取到自定义对象中。然后,您可以在报告,仪表板或其他漂亮的分析工具中使用它。

创建可管理数据集的另一种方法是通过粗略聚合。这些是Async SOQL支持的聚合函数:AVG( field ), COUNT( field ), COUNT_DISTINCT( field ), SUM( field ), MIN( field ), MAX( field )。这些聚合函数可以更好地控制从大对象中提取的数据。

形成您的查询

使用Async SOQL,我们查询自定义大对象 Customer_Interaction__b,并将结果指向我们的目标对象 TargetObject__c。我们将特定日期的客户和游戏内购买信息从我们的自定义大对象提取到目标对象,然后我们可以将其用于报告和分析。必填字段

名称类型描述
询问字符串指定要执行的SOQL查询的参数。
targetObject字符串要插入查询结果的标准对象,自定义对象,外部对象或大对象。
targetFieldMapMap <String,String>定义如何将查询结果中的字段映射到目标对象中的字段。定义时 targetFieldMap 参数,确保字段类型映射是一致的。如果源字段和目标字段不匹配,则适用这些注意事项。任何源字段都可以映射到目标文本字段。如果源和目标字段都是数字,则目标字段必须具有与源字段相同或更多的小数位数。如果不是,则请求失败。此行为是为了确保转换中不会丢失任何数据。如果查询结果中的字段被多次映射,即使映射到目标对象中的不同字段,也只使用最后一个映射。

示例URI

https://yourInstance.salesforce.com/services/data/v41.0/async-queries/

POST请求正文

{ 
   "query": "SELECT Account__c, In_Game_Purchase__c FROM Customer_Interaction__b WHERE Play_Date__c=2017-09-06T00:00:00Z",
   
   "operation": "insert",
   
   "targetObject": "Customer_Interaction_Analysis__c", 
        
   "targetFieldMap": {"Account__c":"Account__c",
                      "In_Game_Purchase__c":"Purchase__c"
                      },
   "targetValueMap": {"$JOB_ID":"BackgroundOperationLookup__c",
                      "Copy fields from source to target":"BackgroundOperationDescription__c"
                     }
}

在此查询中,我们从特定日期2017-09-06获取客户交互大对象的客户和游戏内购买信息,并将该数据发送到我们创建的自定义对象中, Customer_Interaction_Analysis__c。因为我们使用的是Async SOQL而不是标准的SOQL,所以我们可以过滤而不必担心包含其他索引字段。此新自定义对象将填充该日期的所有客户和游戏内购买信息。从那里我们可以开始做一些分析,并试图找出为什么我们的游戏是如此惊人的成功。

POST响应机构响应正文包括查询 的jobId,查询的状态以及任何相关消息。

{ 
   "jobId": "08PD000000003kiT", 
   
   "message": "",
    
   "query": "SELECT Account__c, In_Game_Purchase__c FROM Customer_Interaction__b WHERE Play_Date__c=2017-09-06T00:00:00Z",  
    
   "status": "New",
     
   "targetObject": "Customer_Interaction_Analysis__c", 
     
   "targetFieldMap": {"Account__c":"Account__c", 
                      "In_Game_Purchase__c":"Purchase__c"
                     },
   "targetValueMap": {"$JOB_ID":"BackgroundOperationLookup__c",
                      "Copy fields from source to target":"BackgroundOperationDescription__c"
                     } 
}

跟踪您的查询状态

要跟踪查询的状态,请指定它 JOBID使用HTTP GET请求。查询的状态在。中返回状态领域。如果你没有指定JOBID,我们返回所有查询的状态。该状态 可:

  • 取消- 工作在被运行之前被取消了。
  • 成功- 工作顺利完成。
  • 失败 – 系统提交后作业失败,或者请求超出了Async SOQL限制。消息字段提供有关失败原因的详细信息。
  • 运行- 工作成功运行,组织未超出任何限制。
  • 计划- 新作业已创建并已安排,但尚未运行。

您也可以通过指定HTTP DELETE请求来取消查询 的jobId。取消已完成的查询无效。

请记住,异步SOQL是异步完成的。这意味着您的查询可能需要一段时间才能完成。就像我们之前提到的那样,如果时间紧迫,并且数据集足够小,请使用标准SOQL。或者,我们可以想象一下在这些例子中使用的不那么受欢迎的虚构游戏,但那里的乐趣在哪里呢?示例URI

https://yourInstance.salesforce.com/services/data/v41.0/async-queries/08PD000000003kiT

示例GET响应

{
"jobId": "08PD000000003kiT",
"message": "",
"query": "SELECT Account__c, In_Game_Purchase__c FROM Customer_Interaction__b WHERE Play_Date__c=2017-09-06T00:00:00Z",  
"status": "Success",
"targetObject": "Customer_Interaction_Analysis__c",
"targetFieldMap": {"Account__c":"Account__c",
"In_Game_Purchase__c":"Purchase__c" } 
}

此响应显示我们的查询已成功完成。哇噢!是时候准备报告和仪表板了!

处理错误

在执行Async SOQL查询期间可能会发生两种不同类型的错误。

  • 查询执行中的错误
  • 将结果写入目标大对象的一个​​或多个错误

提交无效查询并超出其中一个异步SOQL限制是执行问题的示例。另一个示例是查询导致底层基础结构出现问题。对于这些错误,响应正文包含状态 失败。message参数提供有关失败原因的更多信息。

其他时候,查询成功执行但在尝试将结果写入目标对象时遇到错误。由于涉及的数据量很大,捕获每个错误都是低效的。相反,生成的错误的子集被捕获 BackgroundOperationResult对象并保留七天。您可以使用Async SOQL查询来查询此对象的jobId过滤特定Async SOQL查询的错误。异步SOQL作业信息保留一年。

把它包起来

现在您了解在您自己的组织中使用自定义大对象所需的一切。哈哈,现在有数十亿条记录。

我们只是触及了Async SOQL的表面。请务必查看资源部分,以查看Async SOQL支持的所有标准SOQL命令以及更多用例示例。您还可以找到有关可在POST请求中使用的可选字段的信息。另请参阅我们的Analytics数据集成基础知识模块,了解如何为从大对象中提取的数据设置分析。想想您可以使用所有数据制作的所有漂亮的图形和仪表板!

Big Objects-定义自定义

学习目标

完成本单元后,您将能够:

  • 创建自定义Big Objects。
  • 构建自定义索引。
  • 部署自定义Big Objects。
  • 填充一个Big Objects。

定义自定义Big Objects

所以你已经查看了自定义Big Objects的用例,或者想出了自己的用例。现在是时候建立一个。

您可以在安装程序中定义自定义Big Objects。您还可以使用Metadata API定义自定义Big Objects,但在安装程序中更简单。要开始使用,请登录您的Trailhead Playground并转到安装程序。在较高的层次上,这就是你如何定义一个Big Objects。

  1. 单击并选择“ 设置”
  2. Big Objects在“快速查找”框中输入,然后选择“ Big Objects
  3. 创建一个Big Objects并添加一些基本细节。
  4. 添加自定义字段。它们将数据存储在您的Big Objects上。
  5. 添加索引。索引定义Big Objects的复合主键,用于查询和过滤Big Objects数据。
  6. 保存Big Objects并将状态更改为已部署。

现在让我们更详细地介绍这些步骤。

虽然自定义Big Objects与标准对象和自定义对象类似,但某些参数对于Big Objects是唯一的,并且某些参数不适用。对象名称在组织中的所有标准,自定义,外部和大型对象中必须是唯一的。

Big Objects定义细节

定义Big Objects时,首先要填写一些有关它的基本细节。

字段名称描述
标签此名称用于引用用户界面中的对象。
多个标签对象的复数名称。
从元音开始如果它适合您组织的默认语言,请指明标签前面是“an”还是“a”。
对象名称Big Objects的唯一API名称。在托管包中,此名称可防止与包安装发生命名冲突。仅使用字母数字字符和下划线。名称必须以字母开头且没有空格。它不能以下划线结尾,也不能有两个连续的下划线。保存后,Big Objects的API名称将使用后缀“__b”与自定义对象后缀“__c”进行标识。
描述有意义的描述可帮助您记住在列表中查看对象时之间的差异。
上下文相关的帮助设置定义用户从对象记录的主页(概述),编辑和详细信息页面,列表视图和相关列表中单击此页面的“帮助”时显示的URL 。此设置不会影响页面顶部的“帮助”链接。该链接始终打开“帮助”窗口。
部署状态创建Big Objects时,状态将设置为In Development。在包含至少包含一个自定义字段的索引之前,您无法部署Big Objects。索引中只允许使用必需的自定义字段。创建索引后,您会看到Deployed的第二个状态。准备好授予用户访问权限后,将状态更改为“已部署”。

Big Objects自定义字段

定义好Big Objects后,添加自定义字段。自定义字段存储Big Objects的唯一数据。您还可以创建自定义关系字段,以将您的Big Objects与Salesforce中的另一个对象相关联。将自定义字段添加到Big Objects的方式与向Salesforce中的任何对象添加自定义字段的方式相同。Big Objects支持以下字段类型:

  • 查找关系
  • 日期时间
  • 文本
  • 文字区(长)

要为Big Objects创建索引,必须至少将一个自定义字段标记为必需。

定义自定义Big Objects的索引

这个很重要!请记住,Big Objects索引中定义的字段决定了Big Objects的身份和查询能力。索引中定义的字段应该是与查询最相关的字段,因此您必须具有远见并在此处进行一些规划。您定义字段的顺序也是一个重要的考虑因素。如果您使用SOQL查询Big Objects,则只能按照您定义它们的顺序查询构成索引的字段。将查询过滤器中最常用的字段分配到第一个位置。你的索引。您还可以仅使用特定的比较运算符,具体取决于字段在查询中的位置。我们将在下一个单元中详细介绍查询。

定义索引时请记住这些注意事项。

  • 索引必须至少包含一个自定义字段,并且最多可以包含五个自定义字段。
  • 索引中包含的自定义字段必须标记为必需。
  • 长文本区域字段不能包含在索引中。
  • 索引中所有文本字段的字符总数不能超过50。
  • 创建索引后,您无法编辑或删除它。要更改索引,请使用新索引创建另一个Big Objects。

Big Objects索引详细信息

定义组成自定义Big Objects索引的字段,并确定字段和排序顺序。

字段名称描述
标签标签用于指代用户界面中的索引。
名称索引的API名称。
索引字段为索引中包含的每个自定义字段设置“索引位置”和“索引方向”。此处的字段顺序决定了它们在索引中的顺序。对于最常用的过滤器参数,将“索引位置”设置为1。Index Direction的有效值为Ascending和Descending。

示例自定义Big Objects

现在您已经知道制作自定义Big Objects需要什么,请尝试制作一个。让我们假装你开发了这款超棒的新游戏,SFORCE-COM:UFBO防御,玩家可以防御地球对抗身份不明的飞行大物体威胁。您希望能够存储玩家在单个游戏会话中进行的所有互动。在每个游戏会话中,您可以在自定义Big Objects中捕获此信息,Customer_Interaction__b:

  • 玩家购买的东西数量 In_Game_Purchase__c
  • 他们取得的最高水平 Level_Achieved__c
  • 他们有多少人的生命 Lives_This_Game__c
  • 他们的平台在 Game_Platform__c
  • 他们的得分在 Score_This_Game__c
  • 他们的客户名称 Account__c
  • 他们的比赛日期在 Play_Date__c
  • 他们的上场时间 Play_Duration__c

您的游戏非常受欢迎,因此对于每个用户,您每天都会进行多次互动,再加上您庞大的玩家群,这是一个非常惊人的记录数。啊,成功的代价!

您可以在自定义Big Objects上定义所有这些字段。定义字段后,还可以定义构成索引的字段。每个玩家的客户名称都是唯一的,因此您已经选择了Account__c作为我们指数中的第一个字段。索引中的下一个字段是玩家的游戏平台,Game_Platform__c那么会议的日期, Play_Date__c。此特定订单允许您仅查询客户,客户和游戏平台,客户,游戏平台和播放日期。

使用这些示例中的确切值来创建具有八个自定义字段和索引的自定义Big Objects。如果表中未列出字段和值,请忽略它或将其保留为默认值。

Big Objects定义细节

字段名称
标签客户互动
多个标签客户互动
对象名称Customer_Interaction
描述留着空白
部署状态开发中

Big Objects自定义字段

  • 游戏内购买
    • 数据类型:文本
    • 现场标签:游戏内购买
    • 长度:16
    • 字段名称:In_Game_Purchase
    • 要求:不
  • 达到水平
    • 数据类型:文本
    • 字段标签:达到等级
    • 长度:16
    • 字段名称:Level_Achieved
    • 要求:不
  • 生活使用这个游戏
    • 数据类型:数字
    • Field Label:生活使用此游戏
    • 长度:18
    • 小数位:0
    • 字段名称:Lives_This_Game
    • 要求:不
  • 平台
    • 数据类型:文本
    • 字段标签:平台
    • 长度:16
    • 字段名称:Game_Platform
    • 要求:是的
  • 得分这个游戏
    • 数据类型:文本
    • Field Label:为这场比赛打分
    • 长度:16
    • 字段名称:Score_This_Game
    • 要求:不
  • 客户
    • 数据类型:查找
    • 相关:客户
    • 字段标签:客户
    • 字段名称:Game_User_Account
    • 要求:是的
  • 比赛日期
    • 数据类型:日期/时间
    • 字段标签:播放日期
    • 字段名称:Play_Date
    • 要求:是的
  • 播放持续时间
    • 数据类型:数字
    • 字段标签:播放持续时间
    • 长度:18
    • 小数位:2
    • 字段名称:Play_Duration
    • 要求:不

现在,您有八个字段可以跟踪所有玩家的互动情况。做得好!

大对象自定义字段

Big Objects索引详细信息

字段名称
标签客户互动指数
名称CustomerInteractionsIndex
索引字段指数位置1:账户_c,降序索引位置2:Game_Platform__c,升序索引位置3:Play_Date__c,降序

部署Big Objects

现在您已经定义了自定义Big Objects,您已准备好部署它。单击 Big Objects上的“ 编辑 ”,然后将部署状态更改为“已部署”。

它们出现在设置中的大对象。

现在,您已准备好开始使用新的自定义Big Objects。

设置中的自定义大对象。

从这里,您可以编辑自定义Big Objects及其字段的标签和名称,但不能编辑或删除索引。要更改索引,请从新的Big Objects开始。您还可以从安装程序中删除自定义Big Objects。删除的Big Objects存储15天。在此期间,您可以恢复或永久删除它,但在这15天后,Big Objects将被永久删除。

填充Big Objects

填充Big Objects有两种主要方式。您可以将.csv文件与Data Loader或API一起使用,或者通过Apex完全执行。使用.csv文件时,文件中的第一行必须包含用于将.csv数据映射到自定义Big Objects的字段标签。将数据上传到Data Loader中的Big Objects或通过Bulk API或SOAP API上传。这是我们用来上传到我们的.csv文件Customer_Interaction__bBig Objects。作为一个例子,一个Big Objects可以支持比我们在这里提供的数据多很多倍的数据。

Play Start,In-Game Purchase,Level Achieved,Lives Used,Platform,Play Stop,Score,Account
2015-01-01T23:01:01Z,A12569,57,7,PC,2015-01-02T02:27:01Z,55736,001R000000302D3
2015-01-03T13:22:01Z,B78945,58,7,PC,2015-01-03T15:47:01Z,61209,001R000000302D3
2015-01-04T15:16:01Z,D12156,43,5,iOS,2015-01-04T16:55:01Z,36148,001R000000302D3

如果你想使用Apex填充 Customer_Interaction__b, 使用 insertImmediate 方法。

// Define the record
Customer_Interaction__b bo = new Customer_Interaction__b();
bo.Account__c = '001R000000302D3';
bo.Game_Platform__c = 'PC';
bo.Play_Date__c = DateTime.newInstance(2018, 2, 5);
bo.In_Game_Purchase__c = 'A12569';
bo.Level_Achieved__c = '45';
bo.Lives_This_Game__c = '3';
bo.Score_This_Game__c = '5500';
bo.Play_Duration__c = 25;
 
// Insert the record, which creates a new record
database.insertImmediate(bo);
// Define the record
Customer_Interaction__b bo = new Customer_Interaction__b();
bo.Account__c = '001R000000302D3';
bo.Game_Platform__c = 'PC';
bo.Play_Date__c = DateTime.newInstance(2018, 2, 5);
bo.In_Game_Purchase__c = 'A12569';
bo.Level_Achieved__c = '45';
bo.Lives_This_Game__c = '3';
bo.Score_This_Game__c = '5500';
bo.Play_Duration__c = 25;
 
// Modify a field in the index
bo.Game_Platform__c = 'Mac';
 
// Insert the record, creating a new record because the primary key has changed 
database.insertImmediate(bo);
// Define the record
Customer_Interaction__b bo = new Customer_Interaction__b();
bo.Account__c = '001R000000302D3';
bo.Game_Platform__c = 'PC';
bo.Play_Date__c = DateTime.newInstance(2018, 2, 5);
bo.In_Game_Purchase__c = 'A12569';
bo.Level_Achieved__c = '45';
bo.Lives_This_Game__c = '3';
bo.Score_This_Game__c = '5500';
bo.Play_Duration__c = 25;
 
// Modify a field not included in the index
bo.Level_Achieved__c = '1';
 
// Insert the record, which updates the second record because the index is the same 
database.insertImmediate(bo);
警告

警告

不允许使用混合DML调用的Apex测试失败。如果只写入Big Objects,则测试会将错误数据插入到您必须手动删除的目标Big Objects中。要包含对目标Big Objects的测试DML调用,请使用带有Apex存根API的模拟框架。

重新插入具有相同索引但具有不同数据的记录会导致类似于upsert操作的行为。如果存在具有索引的记录,则插入将使用新数据覆盖索引值。插入是幂等的,因此插入现有数据不会导致重复。上传数百万条记录时,重新插入很有帮助。如果发生错误,则重新插入会重新上载失败的上载而不会出现重复数据。在重新插入期间,如果提供的索引不存在记录,则插入新记录。

Big Objects-入门

学习目标

完成本单元后,您将能够:

  • 描述Big Objects是什么。
  • 确定自定义Big Objects的常见用例。
  • 确定查询Big Objects的方法。

什么是Big Objects?

您,完美的Salesforce pro,了解所有标准对象,自定义对象和外部对象。您知道这些对象如何帮助您管理和操作数据,以便您可以使用组织或外部系统进行令人惊叹的开拓性事物。

在这个大数据大胆的新时代,您经常会发现自己有太多的数据,这是您自己成功的牺牲品。有些数字要紧缩,但很难有效或有效地处理它们。性能受到欢迎,您开始希望您的标准,自定义或外部对象可能更大。

这就是Big Objects的用武之地。Big Objects允许您在Salesforce平台上存储和管理大量数据。你问多大?

一千条记录?不,想想更大。

十万?更大

一百万?甚至没有关闭

Big Objects为十亿或更多记录提供一致的性能,并且可以通过一组标准API访问组织或外部系统。想想所有这些数据!我们基本上对你已经知道的物体进行了巨大的拍摄,并且喜欢创造大物体。

有两种大型物体。

标准Big Objects由Salesforce定义,并包含在Salesforce产品中。FieldHistoryArchive,我们的Field Audit Trail产品的一部分,是标准Big Objects的一个​​例子。 FieldHistoryArchive 允许您存储长达10年的存档现场历史数据,帮助您遵守与审计和数据保留相关的行业法规。

在安装程序中定义和部署自定义Big Objects。您可以在安装程序中创建自定义Big Objects,您可以在其中设置其定义,字段和索引。Big Objects索引中定义的字段决定了Big Objects的身份及其查询的能力。我们将在下一个单元中将它们组合在一起。

我可以使用自定义Big Objects的一些方法是什么?

虽然您可以使用Big Objects来存储不同类型的数据,但是创建了Big Objects来处理一些特定的场景。

360°客户视图

您有很多想要存储的客户信息。从忠诚度计划到交易,订单和账单信息,使用自定义Big Objects来跟踪每个细节。

审计和跟踪

长期查看用户的Salesforce使用情况,以便进行分析或合规。

历史档案

在优化核心CRM或Lightning Platform应用程序的性能的同时,保持对历史数据的访问以用于分析或合规性目的。

查询Big Objects

当然,如果您无法在记录上运行正确的分析,那么保留所有这些数据对您没有任何帮助。您可以使用标准SOQL或Async SOQL查询Big Objects。

SOQL

您可以使用标准SOQL命令的子集查询Big Objects。如果您知道查询将返回少量数据,不想等待结果,或者需要立即返回结果以便在Apex中使用,请使用SOQL。我们将深入探讨标准SOQL如何与下一个单元中的Big Objects进行不同的工作。

异步SOQL

我们开发了Async SOQL来帮助管理自定义Big Objects中的数百万条潜在记录。Async SOQL是一种在您无法等待实时结果的情况下运行SOQL查询的方法,因为查询的数据非常庞大。它是一个高度可扩展的解决方案,使用SOQL命令的子集,使其易于使用已经熟悉SOQL的任何人。异步SOQL在后台异步调度和运行查询,因此它可以运行通常使用常规SOQL超时的查询。使用Async SOQL,您可以在后台运行多个查询,同时监控其完成状态。设置您的查询,几个小时后回到一个很棒的数据集来使用。

注意

注意

虽然每个许可证都包含自定义Big Objects,但Async SOQL仅包含额外Big Objects容量的许可。

什么是Catch?

由于Big Objects操作的规模,它们不像非Big Objects那样工作。在使用Big Objects时,请记住以下几点。

  • Big Objects仅支持对象和字段权限。
  • 部署Big Objects后,无法编辑或删除索引。要更改索引,请从新的Big Objects开始。
  • SOQL关系查询基于从Big Objects到选择字段列表中的标准或自定义对象的查找字段(不在过滤器或子查询中)。
  • Big Objects支持自定义Salesforce Lightning和Visualforce组件,而不是标准UI元素(主页,详细信息页,列表视图等)。要在记录的相关列表中查看自定义Big Objects数据,可以安装自定义Lightning组件。有关详细信息,请参阅Custom Big Object Creator。
  • 每个组织最多可以创建100个Big Objects。Big Objects字段的限制类似于自定义对象的限制,并取决于您的组织许可证类型。
  • Big Objects不支持包含Big Objects,标准对象和自定义对象的事务。
  • 要支持Big Objects中的数据规模,您不能使用触发器,流,进程和Salesforce应用程序。

使用Heroku运行Salesforce Canvas应用程序

学习目标

完成本单元后,您将能够:

  • 了解Canvas应用程序的身份验证过程。
  • 了解如何使用Heroku运行Salesforce Canvas应用程序。

Salesforce Canvas

使用Salesforce Canvas,您可以将在Heroku上运行的UI或Web应用程序嵌入到Salesforce UI中。Canvas的主要优势是能够使用大量的开源Web技术来构建可轻松与Salesforce集成的Web应用程序。Canvas SDK在Web应用程序中使用JavaScript来访问用户有权访问的Salesforce数据。您可以在本地计算机上开发Canvas应用程序,并使用典型的开发人员流程进行变更管理和部署。

在幕后,Canvas应用程序通过iframe加载到Salesforce中。当然,您可以通过iframe将任何Web应用程序加载到Salesforce的UI中,但使用Canvas,您可以通过JavaScript使用安全通信协议与Salesforce进行通信。当您需要超出Canvas JavaScript API实现的功能时,您可以将Canvas处理的身份验证与Salesforce REST API结合使用,可能使用像JSforce这样的REST API包装器 。

该图表显示Heroku应用程序可以通过Canvas Javascript桥与Salesforce交互

认证

Canvas应用程序在Salesforce中使用已连接的应用程序,可以使用已 签名的请求或典型的 OAuth流来处理身份验证。签名请求方法的一个优点是,当Salesforce管理员允许用户访问Canvas应用程序时,应用程序无需中间授权即可向Salesforce发出请求。加载Canvas应用程序后,应用程序可以开始访问用户有权访问的Salesforce数据。

在Heroku上运行Canvas应用程序时,应用程序需要连接应用程序的消费者秘密,该秘密通过Heroku Config Var提供给应用程序,可作为环境变量提供给应用程序。

基本画布应用程序

基本的Canvas应用加载Canvas SDK JavaScript库:

<script type="text/javascript" src="https://.salesforce.com/canvas/sdk/js/36.0/canvas-all.js"></script>
<script type="text/javascript">
    // callback to access the OAuth access token and context object
    Sfdc.canvas(function() {
        // Save the token
        Sfdc.canvas.oauth.token(window.signedRequestJson.oauthToken);
        window.alert("hello, " + window.signedRequestJson.context.user.fullName);
    });
</script>

应用程序的 上下文数据取决于应用程序在Salesforce中的运行位置。您可以将Canvas应用加载到Chatter提要,Chatter选项卡,布局,移动卡,发布者操作和VisualForce页面中。每个都可以为Canvas应用程序提供不同的上下文。例如,如果Canvas应用程序在客户页面的布局中呈现,则上下文包含客户的数据。然后,Canvas应用程序中的JavaScript可以使用该数据来呈现信息。

使用Heroku的Apex标注和工作流程

学习目标

完成本单元后,您将能够:

  • 了解如何使用Heroku使用Apex标注和工作流程。
  • 了解Apex标注和工作流程的用例。

呼叫Heroku应用程序

有时,由于正在执行的流程的规模或类型,Salesforce上的事件需要由外部系统处理。例如,Salesforce中的用户上载需要调整大小以供将来使用的图像。Heroku可以从Salesforce接收事件并执行一些响应过程。(可选)可以使用REST API或Heroku Connect将流程的输出存储回Salesforce中。

该图显示了Salesforce和从出站消息触发或发送的数据事件的框。 箭头来自框并指向包含Heroku托管的所有应用程序的另一个框

根据Salesforce中的事件调用Heroku应用程序有两种主要方法:工作流出站消息或Apex HTTP标注。工作流出站消息以声明方式进行SOAP调用。Apex HTTP callout以编程方式对Heroku应用程序进行REST调用。无论哪种方式,Heroku应用程序都会收到带有事件详细信息有效负载的请求,然后执行操作。

带有工作流程的标注

使用工作流,您可以声明性地定义规则和外部系统的标注。该规则可以连接到任何Salesforce对象,如Contact或Account,并根据这些记录事件触发:

  • 创建
  • 创建,每次编辑
  • 创建,并随时编辑以符合标准

规则必须具有筛选事件的条件。如果您不想进行任何过滤,则可以添加始终为真的条件。以下是一个示例规则:

“配置工作流规则”对话框的屏幕截图,显示规则名称应为“新建联系人”

要在规则执行时调用Heroku应用程序,请将出站消息添加到即时工作流操作列表中,并将Heroku应用程序端点指定为端点URL,如:

Configure OUtbound Messaging对话框的屏幕截图,显示名为New Contact to Heroku的消息

如果选择Send Session ID,Heroku应用程序可以使用该令牌代表用户进行REST API调用。如果您不发送会话ID。没有办法检查请求是否有效或防止恶意调用您的Heroku应用程序的API端点。

在Heroku方面,您可以使用任何开源Web或REST技术实现事件处理程序。但由于消息是SOAP格式,因此您需要能够解析XML。例如,使用JavaScript,Node.js,Express和express-xml-bodyparser库,这里是一个处理出站消息并解析SOAP消息的端点。

 app.post("/new_contact", function(req, res) {
    var notification = req.body["soapenv:envelope"]["soapenv:body"][0]["notifications"][0];
    var sessionId = notification["sessionid"][0];
    var data = {};
    if (notification["notification"] !== undefined) {
      var sobject = notification["notification"][0]["sobject"][0];
      Object.keys(sobject).forEach(function(key) {
        if (key.indexOf("sf:") == 0) {
          var newKey = key.substr(3);
          data[newKey] = sobject[key][0];
        }
      }); // do something #awesome with the data and sessionId
    }
    res.status(201).end();
  }); 

在此示例中,每次创建联系人时,Heroku应用程序都会收到联系人详细信息,并可以根据需要对数据执行任何操作。

带有Apex触发器的标注

您可以在Salesforce对象上定义Apex触发器以处理以下任何事件:

  • 插入
  • 更新
  • 删除
  • 合并
  • UPSERT
  • 取消删除

触发器可以使用Apex标注对Heroku应用程序上的端点进行REST JSON调用。例如,这是一个调用Heroku应用程序的Apex触发器:

 trigger NewContactWebhookTrigger on Contact (after insert) {
  String url = 'https://foo.herokuapp.com/new_contact';
  String content = Webhook.jsonContent(Trigger.new, Trigger.old);
  Webhook.callout(url, content);
} 

引用的Webhook Apex类是:

 public class Webhook {
  public static String jsonContent(List<Object> triggerNew, List<Object> triggerOld) {
    String newObjects = '[]';
    if (triggerNew != null) {
      newObjects = JSON.serialize(triggerNew);
    }
    String oldObjects = '[]';
    if (triggerOld != null) {
      oldObjects = JSON.serialize(triggerOld);
    }
    String userId = JSON.serialize(UserInfo.getUserId());
    String content = '{"new": ' + newObjects + ', "old": ' + oldObjects + ', "userId": ' + userId + '}';
    return content;
  }
  @future(callout=true) public static void callout(String url, String content) {
    Http h = new Http();
    HttpRequest req = new HttpRequest();
    req.setEndpoint(url);
    req.setMethod('POST');
    req.setHeader('Content-Type', 'application/json');
    req.setBody(content);
    h.send(req);
  }
} 

jsonContent方法获取触发器数据并将其序列化为JSON。callout方法使用JSON有效负载将HTTP发布到Heroku。

与出站消息一样,您可以使用任何开源Web或REST技术构建Heroku应用程序。使用JavaScript,Node.js和Express,端点可以定义为:

 app.post("/new_contact", function(req, res) {
  // do something with req.body
  res.status(201).end();
}); 

在请求处理程序中,req.body是从Apex触发器发送的反序列化JSON数据。

使用Apex触发器,您可以使用某种形式的预共享密钥来验证请求,从而避免潜在的恶意请求。您还可以让有效负载包含会话ID,以便让Heroku应用程序将REST API请求返回给Salesforce以获取或更新数据。