【发布时间】:2016-04-10 13:51:00
【问题描述】:
我将几种不同类型(实体类型?)的文档存储在一个集合中。获取特定类型的所有文档的最佳方法是什么(就像您从表中使用 select * 所做的那样)。
目前我看到的选项:
- 将类型作为属性包含在内。但这意味着在获取文档时要查看每个文档,对吗?
- 将类型名称添加到文档 ID 并尝试使用
typename*按 ID 进行搜索。
有没有更好的方法来做到这一点?
【问题讨论】:
标签: azure azure-cosmosdb
我将几种不同类型(实体类型?)的文档存储在一个集合中。获取特定类型的所有文档的最佳方法是什么(就像您从表中使用 select * 所做的那样)。
目前我看到的选项:
typename* 按 ID 进行搜索。有没有更好的方法来做到这一点?
【问题讨论】:
标签: azure azure-cosmosdb
没有内置的实体类型属性,但您当然可以创建自己的属性,并确保它被索引。此时,就像添加 WHERE 子句一样简单:
WHERE docs.docType = "SomeType"
假设它是一个基于哈希的索引,这应该提供高效的查找并过滤掉不需要的文档类型。
虽然您可以将类型嵌入到属性(例如文档 ID)中,但您必须进行部分字符串匹配,这不如索引属性比较高效.
如果您想知道此查询的成本,则 RU 值会显示在门户中并通过 x-ms-request-charge 返回标头显示。
【讨论】:
我同意 David 的回答,并且使用单个 docType 字段是我第一次开始使用 DocumentDB 时所做的。但是,在做了一些实验后,我开始使用另一个选项。即创建一个is<Type> 字段并将其值设置为true。这比使用单个字符串字段的查询效率略高,因为索引本身是较小的部分索引,但可能会占用更多的存储空间。
这种方法的另一个优点是它为继承和混合提供了优势。例如,我在某些实体上同时拥有 isLookup=true 和 isState=true。我还有其他查找类型。然后在我的应用程序代码中,某些行为对所有查找字段都是通用的,而其他行为仅适用于 State 类型。
【讨论】:
isLookup=true?您是在每个实体类上添加这些属性还是开发了更通用的技术?
如果对集合的 type 属性进行索引,则不会是完整的扫描。
【讨论】: