我正在使用启用了xDB的Sitecore 8.1(MongoDB).我想将访问用户的用户角色存储在xDB中,因此我可以在报告中汇总这些数据.这些角色可能会随着时间的推移而发生变化,因此一个用户可以在某个时间点拥有一组角色,而在以后可以拥有另一组角色.
我可以将这些用户角色作为自定义构面存储在Contact实体上,但是因为它们可能会因访问访问而改变,所以如果我每次用户登录时都更新构面中的数据,我将丢失历史数据( fx.在某次访问时,我无法分辨给定用户的角色.
相反,我可以为我的facet数据创建一个自定义IElement,并存储角色以及一个时间戳,说明给定角色何时注册,但在报告阶段这个模型可能很难处理,我需要连接交互每次生成报告时,带有基于时间戳的角色数据的数据.
是否可以将这些自定义数据存储在xDB中除Contact集合之外的其他内容?我可以在Interactions集合中存储自定义数据吗?有一个名为Tracker.Current.Session.Interaction.CustomValues的属性听起来像我需要的,但如果我在这里存储数据,我能否对数据进行适当的聚合/报告?还有其他任何我没想过的方法吗?
最佳答案 CustomValues
是的,我会在你的情况下使用CustomValues字典.这个字典将被序列化为MongoDB,作为每次交互的嵌套文档(除非字典为空).
另请注意,由于CustomValues是基类Sitecore.Analytics.Model.Entity的成员,因此该字典可用于xDB的许多其他数据类.例如,您可以在PageData和PageEventData对象中存储自定义值.
由于CustomValues接受任何类的对象,因此您的自定义数据类需要一些额外的东西才能成功保存到MongoDB并随后从MongoDB加载:
>必须标记为[Serializable].
>它需要在MongoDB驱动程序中注册,如下所示:
using Sitecore.Analytics.Data.DataAccess.MongoDb;
// [...]
MongoDbObjectMapper.Instance.RegisterModelExtension<YourCustomClassName>();
这需要在每个应用程序生命周期中只执行一次 – 例如,在初始化管道处理器中.
你自己的存储
当然,您不必使用Sitecore的API来存储您的自定义数据.因此,替代方法是手动将数据保存到自定义MongoDB集合或SQL表.然后,您可以在聚合处理器中读取该数据,并通过当前处理的交互的ID找到该数据.
这种方法的好处是您可以决定数据的存储位置和方式.缺点是实现和维护此数据存储的额外工作.