この投稿は、この質問に答えるのにいくらか役立ちます(後で答えを含めます)が、私はいくつかの詳細を望んでいました。
それぞれが独自の方法でRavenからのデータにアクセス/操作する必要がある多くのアプリケーションがあります。データは、メインのWebアプリケーションを介してのみ書き込まれます。他のアプリには、バッチスタイルのタスク、レポートなどが含まれます。これらのそれぞれを可能な限り切り離しておくために、これらは個別のソリューションです。
その場合、レポートアプリケーションから、ローカルで定義されたタイプを使用して、既存のデータにインデックスを作成するにはどうすればよいですか?
リンクされた質問からの回答は次のように述べています
デシリアライズするクラスの構造がデータの構造と部分的に一致している限り、違いはありません。
RavenDBサーバーは、クライアントで使用するクラスをまったく気にしません。確かにdllを共有することも、別のプラットフォームをターゲットにしている場合はポータブルdllを共有することもできます。しかし、あなたはそれが必要ではないということは正しいです。
ただし、Raven-Clr-Typeメタデータ値に注意する必要があります。RavenDBクライアントは、元のドキュメントを保存するときにこれを設定します。逆シリアル化を支援するためにクライアントによって消費されますが、完全には適用されません
それは私が明確にしたかったその最初の部分です。サーバー上のドキュメントとアプリケーションのタイプのオブジェクトグラフは正確に一致する必要がありますか?サーバー上のClickドキュメントが
{
"Visit": {
"Version": "0",
"Domain": "www.mydomain.com",
"Page": "/index",
"QueryString": "",
"IPAddress": "127.0.0.1",
"Guid": "10cb6886-cb5c-46f8-94ed-4b0d45a5e9ca",
"MetaData": {
"Version": "1",
"CreatedDate": "2012-11-09T15:11:03.5669038Z",
"UpdatedDate": "2012-11-09T15:11:03.5669038Z",
"DeletedDate": null
}
},
"ResultId": "Results/1",
"ProductCode": "280",
"MetaData": {
"Version": "1",
"CreatedDate": "2012-11-09T15:14:26.1332596Z",
"UpdatedDate": "2012-11-09T15:14:26.1332596Z",
"DeletedDate": null
}
}
次のようにClickクラスを定義するアプリケーションからMapインデックスを作成することは可能ですか(もしそうなら、どのように?)?
class Click
{
public Guid Guid {get;set;}
public int ProductCode {get;set;}
public DateTime CreatedDate {get;set;}
}
それとも私のクラスはこのように見える必要がありますか?(カスタムタイプは、上記のドキュメントのプロパティのサブセットとして定義されており、プロパティ名が一致しています)
class Click
{
public Visit Visit {get;set;}
public int ProductCode {get;set;}
public MetaData MetaData {get;set;}
}
アップデート
以下の答えに続いて、これが私がうまくいくように管理したコードです。
索引
public class Clicks_ByVisitGuidAndProductCode : AbstractIndexCreationTask
{
public override IndexDefinition CreateIndexDefinition()
{
return new IndexDefinition
{
Map =
"from click in docs.Clicks select new {Guid = click.Visit.Guid, ProductCode = click.ProductCode, CreatedDate = click.MetaData.CreatedDate}",
TransformResults =
"results.Select(click => new {Guid = click.Visit.Guid, ProductCode = click.ProductCode, CreatedDate = click.MetaData.CreatedDate})"
};
}
}
クエリ
var query = _documentSession.Query<ReportClick, Clicks_ByVisitGuidAndProductCode>()
.Customize(x => x.WaitForNonStaleResultsAsOfNow())
.Where(x => x.CreatedDate >= start.Date && x.CreatedDate < end.Date);
Clickはここにあります
public class Click
{
public Guid Guid { get; set; }
public int ProductCode { get; set; }
public DateTime CreatedDate { get; set; }
}
@MattJohnsonに感謝します。