2017-03-08 59 views
0

我有一個文件,看起來基本上是這樣的:DocumentDB由濾鏡陣列陣列

{ 
    "Name": "John Smith", 
    "Value": "SomethingIneed", 
    "Tags: ["Tag1" ,"Tag2", "Tag3"] 
} 

我的目標是編寫一個查詢,我發現在我的數據庫,其Tag屬性包含的所有文件所有的標籤在過濾器中。

例如,在上述情況下,我的查詢可能是["Tag1", "Tag3"]。我想要所有標籤集合都包含Tag1和Tag3的文檔。

我也做了以下內容:

  1. 嘗試過的所有包含類型LINQ查詢

    var tags = new List<string>() {"Test", "TestAccount"}; 
    
        var req = 
         Client.CreateDocumentQuery<Contact>(UriFactory.CreateDocumentCollectionUri("db", "collection")) 
         .Where(x => x.Tags.All(y => tags.Contains(y))) 
         .ToList(); 
    
  2. 創建了一個用戶定義的函數(我不能讓這個在所有的工作)

    var tagString =''Test','TestAccount'「;

    var req = 
         Client.CreateDocumentQuery<Contact>(UriFactory.CreateDocumentCollectionUri("db", "collection"), 
          $"Select c.Name, c.Email, c.id from c WHERE udf.containsAll([${tagString}] , c.Tags)").ToList(); 
    

與containsAll定義爲:

function arrayContainsAnotherArray(needle, haystack){ 
    for(var i = 0; i < needle.length; i++){ 
    if(haystack.indexOf(needle[i]) === -1) 
     return false; 
    } 
    return true; 
} 
  • 使用System.Linq.Dynamic從字符串創建謂詞

    var query = new StringBuilder("ItemType = \"MyType\""); 
    
        if (search.CollectionValues.Any()) 
        { 
         foreach (var searchCollectionValue in search.CollectionValues) 
         { 
          query.Append($" and Collection.Contains(\"{searchCollectionValue}\")"); 
         } 
        } 
    
  • 3實際上爲我工作,但是這個查詢非常昂貴(在10K文檔的集合上超過2000個RU),並且我瘋狂地被扼殺。我的應用程序第一次迭代的結果集必須能夠在結果集中支持10K結果。我怎樣才能最好地查詢與過濾器數組的大量結果?

    謝謝。

    回答

    1

    可以使UDF工作,但它將是全表掃描,因此不建議使用,除非與其他高選擇性標準相結合。

    我相信性能最高的(使用索引)方法是將其分解爲一系列AND語句。你可以通過編程來建立你的查詢字符串(爲了安全起見,要小心完全轉義和用戶提供的數據)。因此,生成的查詢將如下所示:

    SELECT * 
    FROM c 
    WHERE 
        ARRAY_CONTAINS(c.Tags, "Tag1") AND 
        ARRAY_CONTAINS(c.Tags, "Tag3")