4

我希望我在这里没有搞错(一如既往,sitecore 文档很糟糕!)

我想要一种针对访问者存储信息的方法,我对 sitecore 相当陌生,但联系方面似乎是理想的解决方案,从上面的链接中逐字逐句地实施,直到它投入生产,我对此感到非常满意。当我存储它持久的信息时,我可以阅读它:

public IMpmVisitorFacet GetMpmVisitorFacet()
{
    return _contact.GetFacet<IMpmVisitorFacet>(_MPMVisitorConfigName);
}

并设置信息,一切似乎都很棒。我还可以看到SC_ANALYTICS_GLOBAL_COOKIE正在设置的站点核心,一切看起来都很棒。然后我做了一些更彻底的测试......

问题似乎是数据不会持续很长时间。如果我将一些信息放入构面,它将停留一个小时左右(我可以关闭我的浏览器,查看其他网站等)并且我将能够访问它,但在“数量时间”,一切都消失了。

重新访问文档后(我是否提到过它们不是很好),我注意到一个句子中的警告,这是我以前没有看到的:

好吧,我可以创建另一个只读取员工编号的 Web 表单页面。这将告诉我接触面数据 至少存储在内存中。但是永久存储呢?

等等,我以为这是永久存储?!因此,该示例显示了一些读取“方面”的代码。

var contact = Tracker.Current.Contact;
var data = contact.GetFacet<IEmployeeData>("Employee Data");
data.EmployeeId = "ABC123";
.....
<p>Employee data contact facet updated.</p>
<p>Contact ID: <b><%=contact.ContactId.ToString()%></b></p>
<p>Employee #: <b><%=data.EmployeeId%></b></p>

但这个方面似乎只存在很短的一段时间。然后继续:

出于性能原因,Sitecore 仅在会话结束时将联系人数据写入 xDB。这意味着如果我查看 MongoDB...

然后它继续在其新的闪亮时尚的 mongoDb 实现中显示数据。但是,如果我实际上不能以编程方式访问和使用该信息,那么它在 mongo 中有什么用!

所以这就提出了一个问题,一旦会话被放弃,我如何访问这个联系信息?

即用户登录我的网站 -> 我在他们的联系方式中添加了一些信息 -> 他们第二天回来 -> 我想阅读我之前添加的信息

还有其他几个文档讨论了在体验配置文件中访问此数据,以索引到 Lucene体验平台(为什么有两个名称几乎完全相同的产品?!)但没有说明如何在网站本身,在代码中。


要添加Dmytro Shevchenko的评论:

  • 我可以在“体验资料”中看到我的用户,并且可以看到我对该网站的访问。
  • 我知道这个用户确实有我的附加方面信息,因为它触发了一些代码。
  • 我可以在 mongo Db 中找到我的用户(从体验资料页面中的查询字符串中取出的 id)
  • 但是当我在 mongoDb 中查看用户时,附加信息不存在。
  • 一些联系人记录有这些数据,但其他人没有

因此,将新信息写入 mongo 似乎是一个问题……有人对此有任何帮助或类似经验吗?

4

3 回答 3

2

经过大量的调试,摆弄和测试,我终于弄明白了。事实证明,我的问题不是对 mongo 的写入,而是在写入后从 mongo 中读取。

sitecore 文档似乎(像往常一样)完全错过了这个工作的一个相当基本的部分。大约三分之一的文档说明它

public EmployeeData()
{
    base.EnsureAttribute<string>(FIELD_EMPLOYEE_ID);
}

“EnsureAttribute”方法相当于声明一个值类型变量。


好的,这是非常具有误导性的。这EnsureAttribute似乎是从 mongo 将 facet 的数据加载到当前类中。如果您不对构面中的每个属性都执行此操作,则它不会设置来自 mongoDb 的值!这是我的错误,我没有“确保”课堂上的每一个属性。

所以发生的事情是,

  • 我将数据放入方面
  • 方面数据保留在 Session 中,我可以看到、访问它、更改它等等。
  • 数据最终会刷新到 mongo(如果必须,请使用 xDb)
  • 用户返回,系统正确识别(无需识别用户SC_ANALYTICS_GLOBAL_COOKIE为你做这个)
  • 但它不会加载数据(从 mongo 中加载并返回到会话中),除非您“确保”它。

因此,EnsureAttribute它不会“声明值类型”(我认为这完全错误)它会将数据从 mongodb 加载到当前的Session.

于 2015-09-30T09:53:26.980 回答
0

我认为您在这里可能缺少的步骤是Tracker.Current.Session.Identify()识别已知联系人的方法。Tracker api 中的数据仅持续当前会话,您需要将联系人加载到会话中。

xDB 的实施依赖于在访问站点时识别自己的联系人,例如通过登录或注册。

他们登录后,您可以使用唯一标识符,例如电子邮件地址并将其传递给识别方法 - Tracker.Current.Session.Identify("Email Address of the visitor")

一旦你调用了这个方法,如果用户之前已经识别了自己,联系人数据将被加载到当前会话中,并且任何现有的方面信息都将在 Tracker Api 中可用。

于 2015-09-29T19:30:30.097 回答
-1

您的问题在于您如何拉动联系人:如果您在页面请求中,您应该通过 Tracker.Current.Contact 访问当前联系人。您的代码不在页面请求中,但用户可能有实时会话,请使用 ContactManager 和上述方法。如果联系人现在不在实时会话中,您应该使用 ContactRepository。在此处查看有关如何使用它的示例。复制自Dmitry Shevchenko 回答的https://sitecore.stackexchange.com/questions/3319/why-are-custom-xdb-facets-being-overwritten-on-session-end 。

于 2017-03-14T16:59:37.663 回答