2012-04-26 20 views
3

我有一個域實體聯繫人,聯繫方式與通過的memberOf屬性列表相關聯(包含RavenDB列表ID)我怎樣纔能有效地檢查文檔的存在,在RavenDB

public class Contact 
{ 
    public string Id { get; set; } 
    public string Email { get; set; } 
    public string Name { get; set; } 
    public string Country { get; set; } 
    public List<string> MemberOf { get; set; } 
} 

我想用RavenDB來存儲聯繫人,上傳聯繫人的方法之一是通過CSV文件(批量)。我在考慮如何防止重複數據,當兩個CSV文件具有相同的聯繫人時,我認爲聯繫人具有相同的電子郵件時是相同的 - 這與我的域邏輯有關。聯繫人可以是會員的兩個不同的CSV列表,例如
我上傳了兩個具有相同電子郵件地址字段的CSV列表,問題是我希望聯繫人類將MemeberOf設置爲具有兩個列表,這樣可以避免我爲每個列表重複條目,因爲域邏輯我的應用程序需要每個電子郵件一個聯繫對象進行統計分析

請挑戰我的設計,我可能沒有最好的數據模型在這裏。

謝謝

+0

每次導入需要上傳多少個文檔,您希望運行多少個導入以及您期望總共導入多少個文檔? – 2012-04-26 19:46:13

+0

在我的答案下面解決了你的問題? – 2012-04-27 09:32:16

回答

4

RavenDB爲您執行的唯一唯一約束是文檔ID。因此,您可以使用的一種方法是使電子郵件地址成爲文檔ID。在電子郵件地址

using (var session = docStore.OpenSession()) 
{ 
    foreach (var csvItemToImport in csvfile) 
    { 
     var existingDoc = session.Load<Contact>(csvItemToImport.Email);  
     if (existingDoc == null) 
     { 
      //No doc with the given email exists, add a new one 
      session.Store(new Contact{ ... }); 
     } 
     else 
     { 
      existingDoc.MemberOf.Add(csvItemToImport.ListName) 
      // No need to store the doc, it's tracked in the session automatically 
     }  
    } 
    //Save the changes so far back to the dBase, in a single batched transaction 
    session.SaveChanges(); 
} 

因爲文件編號是url(/docs/contacts/[email protected]),你可能需要做一些逃往佔「@」:那麼你可以這樣寫代碼。

和你的POCO看起來就像這樣:

public class Contact 
{ 
    public string Id { get; set; } //this is actually an email address 
    public string Name { get; set; } 
    public string Country { get; set; } 
    public List<string> MemberOf { get; set; } 
} 

更新,如果你不希望文件編號爲(無論何種原因)的電子郵件地址。您可以使用方法outlined here。它每次只存儲兩個文檔,即Contact文檔和另一個確保唯一約束的文檔。

+0

只要每個電子郵件地址都是唯一的聯繫人,我同意此解決方案。如果你想支持電子郵件地址改變和反映同一聯繫人的能力,那麼你需要一個不同的ID。此外,else塊中的session.Store()是多餘的,因爲existingDoc已被跟蹤。您可以刪除該行以獲得輕微的性能提升。最後一個注意事項是,如果您只是想在不加載文檔的情況下檢查文檔是否存在,請使用session.Advanced.DatabaseCommands.Head()。它只會加載標題而不是整個文檔。 – 2012-05-01 17:46:53

+0

謝謝Matt,我會更新我的回答 – 2012-05-02 09:58:31

+0

另請參閱最後的「更新」部分,瞭解如何更改電子郵件地址 – 2012-05-02 10:00:52