0

この投稿は、この質問に答えるのにいくらか役立ちます(後で答えを含めます)が、私はいくつかの詳細を望んでいました。

それぞれが独自の方法で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に感謝します。

4

1 に答える 1

1

形状は部分的に一致しており、可能な場合は塗りつぶされるため、2番目の例は問題なく機能します。

ただし、最初の例で示している結果を予測するインデックスを作成することはできます。実際にフィルタリングまたは並べ替えようとしているものをマップしてから、TransformResultsセクションを追加します。

TransformResults = (database, clicks) =>
    from click in clicks
    select new {
        click.Visit.Guid,
        click.ProductCode,
        click.MetaData.CreatedDate
    };

このインデックスをクエリすると、変換で指定した形で出力されます。これは「ライブプロジェクション」と呼ばれる機能で、ここで詳細を読むことができます。.As()(電話は必要ありません。使用するだけ.Query<Click, YourIndex>()で問題なく動作するはずです。)

これとは別に、MetaDataで何をしているのかは無関係です。Ravenは、メタデータをドキュメントから分離します。メタデータの詳細については、こちらをご覧ください。

バージョン管理に懸念があるようです。監査証跡を保持しているだけの場合は、Ravenの標準のバージョニングバンドルを確認する必要があります。時間的有効性に懸念がある場合は、新しい時間的バージョン管理バンドルの使用を検討してください。

于 2012-12-10T20:22:15.170 に答える