2017-03-08 7 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 query = new StringBuilder("ItemType = \"MyType\""); 
    
        if (search.CollectionValues.Any()) 
        { 
         foreach (var searchCollectionValue in search.CollectionValues) 
         { 
          query.Append($" and Collection.Contains(\"{searchCollectionValue}\")"); 
         } 
        } 
    
  3. から述語を作成するための

    function arrayContainsAnotherArray(needle, haystack){ 
        for(var i = 0; i < needle.length; i++){ 
        if(haystack.indexOf(needle[i]) === -1) 
         return false; 
        } 
        return true; 
    } 
    
    <オール開始= "3">
  4. 使用System.Linq.Dynamic:

    のように定義のcontainsAllと
    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(); 
    

3実際に私のために働いた、クエリは非常に高価でした(10Kドキュメントのコレクションで2000以上のRU)、私は狂ったように絞られています。私のアプリケーションの最初の反復の結果セットは、結果セットで10Kの結果をサポートできる必要があります。フィルタの配列を使用して多数の結果を最適に照会するにはどうすればよいですか?

ありがとうございました。

答えて

1

UDFは動作させることができますが、完全なテーブルスキャンであるため、他の高度に選択基準と組み合わせないと推奨されません。

私は最もパフォーマンスの高い(インデックスを使用する)アプローチは、それを一連のANDステートメントに分割することだと思います。これをプログラムで実行して、クエリ文字列を作成することができます(セキュリティ上の理由から完全にエスケープし、ユーザーが提供するデータに注意してください)。その結果、クエリは次のようになります。

SELECT * 
FROM c 
WHERE 
    ARRAY_CONTAINS(c.Tags, "Tag1") AND 
    ARRAY_CONTAINS(c.Tags, "Tag3") 
関連する問題