【问题标题】:DocumentDB: get all documents of same entity typeDocumentDB:获取相同实体类型的所有文档
【发布时间】:2016-04-10 13:51:00
【问题描述】:

我将几种不同类型(实体类型?)的文档存储在一个集合中。获取特定类型的所有文档的最佳方法是什么(就像您从表中使用 select * 所做的那样)。

目前我看到的选项:

  1. 将类型作为属性包含在内。但这意味着在获取文档时要查看每个文档,对吗?
  2. 将类型名称添加到文档 ID 并尝试使用 typename* 按 ID 进行搜索。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: azure azure-cosmosdb


    【解决方案1】:

    没有内置的实体类型属性,但您当然可以创建自己的属性,并确保它被索引。此时,就像添加 WHERE 子句一样简单:

    WHERE docs.docType = "SomeType"
    

    假设它是一个基于哈希的索引,这应该提供高效的查找并过滤掉不需要的文档类型。

    虽然您可以将类型嵌入到属性(例如文档 ID)中,但您必须进行部分字符串匹配,这不如索引属性比较高效.

    如果您想知道此查询的成本,则 RU 值会显示在门户中并通过 x-ms-request-charge 返回标头显示。

    【讨论】:

      【解决方案2】:

      我同意 David 的回答,并且使用单个 docType 字段是我第一次开始使用 DocumentDB 时所做的。但是,在做了一些实验后,我开始使用另一个选项。即创建一个is<Type> 字段并将其值设置为true。这比使用单个字符串字段的查询效率略高,因为索引本身是较小的部分索引,但可能会占用更多的存储空间。

      这种方法的另一个优点是它为继承和混合提供了优势。例如,我在某些实体上同时拥有 isLookup=trueisState=true。我还有其他查找类型。然后在我的应用程序代码中,某些行为对所有查找字段都是通用的,而其他行为仅适用于 State 类型。

      【讨论】:

      • 我看到你在多个答案中推荐了这种技术。你如何实现这个isLookup=true?您是在每个实体类上添加这些属性还是开发了更通用的技术?
      • 我使用 node.js,所以不确定使用 .NET 的最佳方式
      • 我明白了。感谢您澄清这些问题 - 我发现您对 DocumentDB 的回答最有用。
      【解决方案3】:

      如果对集合的 type 属性进行索引,则不会是完整的扫描。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-09
        • 1970-01-01
        • 2013-03-03
        • 2021-05-24
        • 2012-06-20
        • 2021-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多