こんにちは、RavenDB

最近、彼はNoSQLソリューションRavenDBを積極的に研究し、使用し始めました。 それで、RavenDBの使用を開始する方法についての紹介記事を書くことにしました。 実際、この記事はプロジェクトWebサイトの「Hello world」の説明とそれほど違いはありません(また、そこから例を取り上げました)。 私は、RavenDBの専門家ではなく、ごく最近RavenDBをプロジェクトやタスクに使用しているとすぐに言いたいと思います。

PSなぜMongoDBやCouchDBを使わないのですか? わかりません。この特定のソリューションを試してみたかっただけです。 そして、この決定はまだ行われていませんでした。


まず、プロジェクトのWebサイトから最新バージョンをダウンロードする必要があります

アーカイブにはServerフォルダーがあり、RavenDBサーバーはその中にあります。 実行すると、データベースのあるDataフォルダーが近くに表示されます。 そのサイズは約90MBになります。これは、サーバーが将来のデータ用に大きなディスク領域を予約するためです。 このサイズを小さくしたい場合は、サーバーの構成ファイルにパラメーター-Raven / Esent / LogFileSizeを追加できます。デフォルト値は、 ドキュメントに記載されているように16 MBです。しかし、実際、データベースのサイズは、で1。
実行中のサーバーは、データベースにアクセスするためのWebインターフェイスを提供します。 デフォルトでは、アドレスはhttp:// localhost:8080です。 その中で、データベース内のドキュメントを管理し、インデックスを追加および削除できます。



サーバーを起動してデータベースを作成したら、Visual Studioを開いてコンソールアプリケーションを作成します。 NuGetがインストールされている場合は、[参照設定]を右クリックし、[ライブラリパッケージ参照の追加]をクリックします。 [オンライン]タブに移動し、RavenDBを見つけてインストールします。 NuGetがない場合、 置いて Clientフォルダーから3つのアセンブリを追加する必要があります(.NET 3.5を使用している場合は、Client-3.5フォルダーから)。

これで、コードの記述を開始できます。 次の2行はDocumentStoreクラスのオブジェクトを作成します。これは、後でデータベースを操作するために使用されます。

var store = new DocumentStore {Url = "http://localhost:8080" };
store.Initialize();


次に、ドメインモデルを記述するクラスをいくつか作成します。

public class Product
{
public string Id { get ; set ; }
public string Name { get ; set ; }
public decimal Cost { get ; set ; }
}

public class Order
{
public string Id { get ; set ; }
public string Customer { get ; set ; }
public IList OrderLines { get ; set ; }

public Order()
{
OrderLines = new List ();
}
}

public class OrderLine
{
public string ProductId { get ; set ; }
public int Quantity { get ; set ; }
}


各クラスにはIdプロパティがあることに注意してください。これは前提条件です。このプロパティでは、RavenDBはドキュメントの一意の番号を格納します。

次のコードは、2つのドキュメントをデータベースに追加します。

using ( var session = store.OpenSession())
{
var product = new Product
{
Cost = 3.99m,
Name = "Milk" ,
};
session.Store(product);
session.SaveChanges();

session.Store( new Order
{
Customer = "customers/ayende" ,
OrderLines =
{
new OrderLine
{
ProductId = product.Id,
Quantity = 3
},
}
});
session.SaveChanges();
}


APIは作業単位パターンを実装します。 まず、セッションオブジェクトを作成し、次にオブジェクトをそのオブジェクトに保存します(Storeメソッド)。 この段階では、製品オブジェクトはアプリケーションのメモリ内にあり、SaveChangesメソッドの呼び出しがデータベースに送信された後にのみ配置されます。

アプリケーションの実行後、サーバー(http:// localhost:8080)に移動し、ドキュメントタブで2つのドキュメントを確認できます。 ドキュメントを開くと、上記のクラスのすべてのプロパティと、[ドキュメントメタデータ]タブのプロパティが表示されます。 オブジェクトの.NETタイプ、RavenDBサーバーのバージョン、データベース内のエンティティの名前を記述します。



アプリケーションからこれらのオブジェクトを読み取るには、次のコードを記述するだけです。

using ( var session = store.OpenSession())
{
var order = session.Load( "orders/1" );
Console .WriteLine( "Customer: {0}" , order.Customer);
foreach ( var orderLine in order.OrderLines)
{
Console .WriteLine( "Product: {0} x {1}" , orderLine.ProductId, orderLine.Quantity);
}
}


つまり エンティティエンティティの1に等しいIDでドキュメントをロードします。

実際のアプリケーションでは、ドキュメントを検索するためのこのような機能は明らかに十分ではないため、フィールドによる検索が必要であり、このためにはインデックスを追加する必要があります。

store.DatabaseCommands.PutIndex( "OrdersContainingProduct" , new IndexDefinition
{
Map = orders => from order in orders
from line in order.OrderLines
select new { line.ProductId }
});


これで、ProductIdでドキュメントを選択できます。

using ( var session = store.OpenSession())
{
var orders = session.LueneQuery( "OrdersContainingProduct" )
.Where( "ProductId:products/1" )
.ToArray();

foreach ( var order in orders)
{
Console .WriteLine( "Id: {0}" , order.Id);
Console .WriteLine( "Customer: {0}" , order.Customer);
foreach ( var orderLine in order.OrderLines)
{
Console .WriteLine( "Product: {0} x {1}" , orderLine.ProductId, orderLine.Quantity);
}
}
}

これは、RavenDBで遊ぶのに十分です。 いくつかの点に注意したい唯一のこと:
  1. 多くのオブジェクトをロードする必要がある場合、それらをいくつかの部分に分割し、部分にロードする必要があります。 これは、SaveChangesメソッドが実行されるまで、すべてのデータがメモリに保存され、簡単に見落とされる可能性があるためです。 また、RavenDBライブラリでは、SaveChangesを30回以上呼び出すことはできません。
  2. データベースを検索すると、RavenDBエンジンは128個のページでデータを返します。したがって、それらをすべて表示するには、次のように記述する必要があります。

    var query = session.Advanced.LuceneQuery<Order>( "OrdersContainingProduct" )
    .Where( "ProductId:products/1" );
    int actual = 0;
    const int pageSize = 128;
    int count = query.QueryResult.TotalResults;

    do
    {
    var orders = session.Advanced
    .LuceneQuery<Order>( "OrdersContainingProduct" )
    .Where( "ProductId:products/1" )
    .Skip(actual)
    .Take(pageSize);

    actual = actual + pageSize;
    foreach ( var order in orders)
    {
    App.Logger.Info( "Id: {0}" , order.Id);
    App.Logger.Info( "Customer: {0}" , order.Customer);
    }

    if (actual >= count)
    break ;
    } while ( true );



参照資料


プロジェクトサイト
Raven DBを選ぶ理由
RavenDB-はじめに

Source: https://habr.com/ru/post/J113571/


All Articles