17

より具体的には、Raven DB で、次のようなシグネチャを持つジェネリック メソッドを作成したいと考えています。

public void Clear<T>() {...

次に、Raven DB に指定されたタイプのすべてのドキュメントをクリアさせます。

Ayende による他の投稿から、これをバッチとして行うにはインデックスが必要であることを同様の質問から理解しています。

これには、各ドキュメント タイプをマップするインデックスを作成する必要があると思います。これは大変な作業のように思えます。

データベースで直接 set delete を実行する上記のようなメソッドを作成する効率的な方法を知っている人はいますか?

4

4 に答える 4

23

.NETクライアントからこれを実行したいと思います。その場合は、標準のDocumentsByEntityNameインデックスを使用します。

var indexQuery = new IndexQuery { Query = "Tag:" + collectionName };
session.Advanced.DocumentStore.DatabaseCommands.DeleteByIndex(
   "Raven/DocumentsByEntityName", 
   indexQuery, 
   new BulkOperationOptions { AllowStale = true });

var hilo = session.Advanced.DocumentStore.DatabaseCommands.Get("Raven/H‌​ilo/", collectionName);
if (hilo != null) {
    session.Advanced.DocumentStore.DatabaseCommands.Delete(hilo.‌​Key, hilo.Etag);
}

collectionNameコレクションの実際の名前はどこにありますか。

最初の操作でアイテムが削除されます。2番目はHiLoファイルを削除します。

また、公式ドキュメント-インデックスを使用してドキュメントを削除または更新する方法も確認してください。

于 2012-10-24T12:25:17.237 に答える
9

多くの実験の後、答えは非常に単純であることがわかりましたが、明らかではありません。

public void Clear<T>()
{
    session.Advanced.DocumentStore.DatabaseCommands.PutIndex(indexName, new IndexDefinitionBuilder<T>
    {
        Map = documents => documents.Select(entity => new {})
    });

    session.Advanced.DatabaseCommands.DeleteByIndex(indexName, new IndexQuery());
}

もちろん、ほとんどの場合、インデックスの定義と削除を一度に行うことはありません。簡潔にするために、これを 1 つのメソッドとして示しました。

私自身の実装では、ドキュメントで推奨されているように、アプリケーションの開始時にインデックスを定義しています。

このアプローチを使用して T のプロパティを実際にインデックス付けする場合は、T を制約する必要があります。たとえば、すべてのドキュメント クラスが継承する IEntity があり、このクラスがプロパティ ID を指定するとします。次に、「where T : IEntity」を使用すると、そのプロパティをインデックスで使用できます。

他の場所でも言われていますが、Raven がおそらくそれを使用する静的インデックスを定義すると、クエリが挿入したデータを返さないように見える可能性があることにも注意してください。

RavenDB ディスククエリへの保存

于 2012-04-19T06:30:00.843 に答える
4

http://blog.orangelightning.co.uk/?p=105を使用してそれを行うことができます。

于 2012-04-14T15:00:18.987 に答える