【问题标题】:DocumentDB filter an array by an arrayDocumentDB 按数组过滤数组
【发布时间】:2017-03-08 05:19:03
【问题描述】:

我的文档看起来基本上是这样的:

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

我的目标是编写一个查询,在其中找到我的数据库中的所有文档,其Tag 属性包含过滤器中的所有标签。

例如,在上述情况下,我的查询可能是["Tag1", "Tag3"]。我想要其标签集合包含 Tag1 和 Tag3 的所有文档。

我做了以下事情:

  1. 尝试了 All Contains 类型的 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;
 }
  1. 使用 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 结果。如何使用一组过滤器最好地查询大量结果?

谢谢。

【问题讨论】:

    标签: c# azure azure-cosmosdb


    【解决方案1】:

    可以使 UDF 工作,但它会是全表扫描,因此不建议使用,除非与其他高选择性标准结合使用。

    我相信最高效(使用索引)的方法是将其拆分为一系列 AND 语句。您可以通过编程方式构建查询字符串(出于安全原因,请小心完全转义和用户提供的数据)。因此,生成的查询如下所示:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-20
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多