4

ここで間違った結論に達していないことを願っています (いつものように、サイトコアのドキュメントは悲惨です!)

私は訪問者に対して情報を保存する方法を望んでいました.私はかなりサイトコアに慣れていませんが、連絡先ファセットは理想的な解決策のようでした. 永続化された情報を保存すると、それを読み取ることができました。

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

とセット情報とすべてが素晴らしかった。また、サイトコアSC_ANALYTICS_GLOBAL_COOKIEが設定されているのも見えました。すべてが素晴らしいように見えました。それから私はいくつかのより徹底的なテストをしました...

問題は、データが長期間保持されないことです。ファセットに何らかの情報を入力すると、1 時間ほどハングアップし (ブラウザを閉じて、他のサイトやサイトなどを見ることができます)、アクセスできるようになりますが、「しばらくすると」時間」それはすべてなくなります。

ドキュメントを再確認したところ (ドキュメントがあまり良くないと言いました)、以前には見られなかった文の警告に気付きました。

さて、従業員番号のみを読み取る別の 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およびエクスペリエンス プラットフォームにインデックスを作成する方法について説明しているドキュメントが他にもいくつかあります(ほぼ同じ名前の 2 つの製品があるのはなぜですか?!)。コード内の Web サイト自体。


Dmytro Shevchenkoのコメントに追加するには:

  • 「経験プロファイル」で自分のユーザーを確認でき、サイトへの訪問を確認できます。
  • このユーザーが何らかのコードをトリガーしたため、追加のファセット情報を持っていたことはわかっています。
  • mongo Dbでユーザーを(エクスペリエンスプロファイルページのクエリ文字列から取得したIDから)見つけることができます
  • しかし、mongoDb でユーザーを見ると、追加情報はありません。
  • 一部の連絡先レコードにはこのデータがありますが、他のレコードにはありません

したがって、新しい情報をmongoに書き込む際の問題のようです...誰かこれについて何か助けや同様の経験がありますか?

4

3 に答える 3

2

大量のデバッグ、いじり、テストの後、私はついにこれを理解しました。私の問題は、mongo への書き込みではなく、それが書き込まれた後に mongo から読み戻すことであることが判明しました。

サイトコアのドキュメントは (いつものように) この作業のかなり基本的な部分を完全に見逃しているようです。ドキュメントの約 3 分の 1 に次のように記載されています。

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

「EnsureAttribute」メソッドは、値型の変数を宣言するのと同じです。


わかりました、これは非常に誤解を招きます。これEnsureAttributeは、ファセットのデータを mongo から現在のクラスにロードするように見えます。ファセット内のすべてのプロパティに対してこれを行わないと、mongoDb から値が設定されません! これは私の間違いでした。クラス内のすべてのプロパティを「保証」していませんでした。

それで、何が起こっていたかというと、

  • データをファセットに入れました
  • ファセットデータはセッションに保持され、表示、アクセス、変更などを行うことができます。
  • データは最終的にmongoにフラッシュされます(必要な場合はxDb)
  • ユーザーが戻ると、システムはそれらを正しく認識します (ユーザーを識別する必要はありませんSC_ANALYTICS_GLOBAL_COOKIE。がこれを行います)。
  • ただし、データを「保証」しない限り、(mongo からセッションに) データをロードしません。

したがって、「値の型を宣言」しEnsureAttributeません(これは私の意見では完全に間違っています)、データを mongodb から現在の にロードします。Session

于 2015-09-30T09:53:26.980 に答える