【问题标题】:How to index for missing values in cosmosDB?如何索引 cosmosDB 中的缺失值?
【发布时间】:2019-07-12 21:05:06
【问题描述】:

假设我需要验证 CosmosDB 集合中的每个文档都设置了AnImportantProperty(= 属性存在,可能具有显式值 null)。他们中的大多数人都这样做,但出于“原因”,他们中的一些人可能不会。

我可以将新属性包含到索引策略中,因此我可以通过索引覆盖的查询轻松找到哪些文档是正常的:

select * from c where is_defined(c.AnImportantProperty)

但是相反的查询(这是我真正感兴趣的)似乎并没有从索引中受益:

select * from c where NOT is_defined(c.AnImportantProperty)

有没有办法编写索引/查询来查找缺少属性的文档而无需全面扫描?

编辑: 例如,我听说过一些关于negated indexesmysterious "v2 index" 的二手谣言。两者都可能表明存在(或将要)解决这种情况。

【问题讨论】:

    标签: performance indexing azure-cosmosdb azure-cosmosdb-sqlapi


    【解决方案1】:

    几乎没有。我想不出任何东西,因为您实际上列出了除已知值之外的所有内容。但是,我会建议一些不同的方法。

    1. 在您的所有文档中引入type 属性
    2. 在某些属性上不同的类/对象可以(我不会说应该,尽管我是认真的)被认为是不同的类型(即使一个只是继承另一个)
    3. 将没有属性的存储为type=“someType”,将具有type=“someOtherType"的存储
    4. 查询您需要的相应类型
    5. 如果还不够,请介绍subtype

    我可能会尝试类似的方法。任何避免扫描过多的东西。

    【讨论】:

    • 它可以像这样解决,但它是间接知识,因为类型属性和属性的存在本身可能不同步。验证其正确性是全面扫描。我在 OP 中添加了谣言链接,为什么我希望有更好的自动索引级解决方案。
    • @ImrePühvel 我认为这完全取决于您如何为您的域/应用程序建模。如果您的模型中需要您的属性,则不能有任何差异。问题实际上是在哪里检查财产(并对其采取行动)更好:在创建时还是在查询时?毫无疑问,我会在创建时强制执行它,因为这样可以提供可预测的查询性能/成本,并且我认为可以更好地扩展。即使他们带有这样的索引,我怀疑我会在这个用例中依赖它。只是我的 2c
    【解决方案2】:

    目前(2019 年 7 月)NOT 似乎可以编写这样的查询。

    不过,所有希望都没有消失,因为根据Azure Cosmos DB Team comment for the feature request,它正处于计划阶段。

    更新:https://devblogs.microsoft.com/cosmosdb/april-query-improvements/ 报告,该功能现已完成:

    现在可以更高效地运行带有不等式过滤器或未定义值过滤器的查询。以前,这些过滤器不使用索引。执行查询时,Azure Cosmos DB 将首先评估查询中其他成本较低的筛选器(例如 =、> 或

    以下是经过改进的查询过滤器的完整列表:

    • 不等式比较表达式(例如 c.age != 4)
    • NOT IN 表达式(例如 c.name NOT IN ('Luis', 'Andrew', 'Deborah'))
    • 未定义
    • Is 表达式(例如 NOT IsDefined(c.age)、NOT IsString(c.name))
    • 合并运算符表达式(例如 (c.name ?? ‘N/A’) = ‘Thomas’)
    • 三元运算符表达式(例如 c.name = null ?'N/A' : c.name)

    如果您有使用这些过滤器的查询,您应该为相关属性添加索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 2011-11-03
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多