2012-04-13 51 views
17

更具體地說,在Raven DB中,我想創建一個帶有簽名的泛型方法;Raven DB:如何刪除給定類型的所有文檔

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

然後讓Raven DB清除給定類型的所有文檔。

我從Ayende的其他職位瞭解到類似的問題,你需要一個索引來作爲批處理。

我認爲這將涉及到創建一個映射每個文檔類型的索引 - 這看起來像很多工作。

有誰知道創建類似上面的方法的一種有效方法,它將直接在數據庫中進行集合刪除?

回答

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()); 
} 

當然,你幾乎肯定會沒有定義索引,做你刪除一氣呵成,我已經把這個作爲簡潔起見一個方法。

我自己的實現定義了文檔建議的應用程序啓動時的索引。

如果你想使用這種方法來實際索引T的屬性,那麼你需要約束T.例如,如果我有一個IEntity,我所有的文檔類繼承,並且這個類指定一個屬性Id。然後,'where T:IEntity'將允許您在索引中使用該屬性。

它在其他地方已經說了,但它也是值得注意的是,一旦你定義一個靜態指標烏鴉可能會使用它,這可能會導致您的查詢看似不返回你插入的數據:

RavenDB Saving to disk query

+1

作爲RavenDB的貢獻者,我不推薦這種方式,因爲您正在不必要地創建索引。相反,我推薦@ alexn的回答:http://stackoverflow.com/a/13049179/536 – 2016-05-03 14:04:55

4

你可以做到這一點使用: http://blog.orangelightning.co.uk/?p=105

+0

嗨Ayende,你的答案是真正有用的,但不是我一直在尋找的東西。經過大量的實驗和對Raven的學習之後,我找到了我正在尋找的解決方案。我會在短時間內爲其他人發佈答案。 – 2012-04-19 06:12:31

+0

我發現這是最簡單的非程序化解決方案。 – Keith 2013-05-17 17:44:01

+0

我從未在該博客中找到過重置命令。最終得到與Ryan相似的指數。 – 2013-12-23 11:34:32

22

我假設你想要從.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是您收藏的實際名稱。

第一次操作刪除項目。第二個刪除HiLo file

也查看官方文檔 - How to delete or update documents using index

+1

這是比接受的答案更好的方式,因爲它不需要創建索引並刪除任何不可能的文檔如果您使用現有索引進行刪除,請將其包含在內。 – wal 2014-11-11 00:22:48

+0

我也想刪除相關的HiLo文件來重置ID。 @alexn可以編輯你的代碼來添加這個嗎? 'var hilo = session.Advanced.DocumentStore.DatabaseCommands.Get(「Raven/Hilo/themes」); session.Advanced.DocumentStore.DatabaseCommands.Delete(hilo.Key,hilo.Etag);' – SandRock 2015-10-28 10:16:18

+0

@SandRock絕對:) – alexn 2015-10-28 13:21:45

6

我也有這個問題,這是爲我工作的解決方案。我只在一個測試項目中工作,所以這可能是一個更大的分貝緩慢,但瑞恩的答案不適合我。

public static void ClearDocuments<T>(this IDocumentSession session) 
    { 
     var objects = session.Query<T>().ToList(); 
     while (objects.Any()) 
     { 
      foreach (var obj in objects) 
      { 
       session.Delete(obj); 
      } 

      session.SaveChanges(); 
      objects = session.Query<T>().ToList(); 
     } 
    } 
+0

我也在針對嵌入式商店運行測試,只有您的解決方案適用於我。在Google Groups(https://groups.google.com/forum/#!topic/ravendb/QqZPrRUwEkE)上發佈的帖子表明,您需要先在此場景中創建DocumentsByEntityName索引:「new RavenDocumentsByEntityName()。Execute(store) ;」 做完這些之後,我仍然發現應該刪除的文檔仍然存在(我也阻止了陳舊的查詢被返回,所以這也不是答案)。 – rogersillito 2015-02-25 18:26:40

相關問題