【问题标题】:Querying CosmosDB Collection with property that have the same property but with different types使用具有相同属性但具有不同类型的属性查询 CosmosDB 集合
【发布时间】:2021-02-01 23:01:26
【问题描述】:

假设我有一个 Cosmos Db 集合,它拥有这两个类所解释的文档

public class DocumentBase {
    public string DocumentType {get; set;}
}
public class DocumentA : DocumentBase {
   public string PropertyA {get; set;}
}

public class DocumentB : DocumentBase {
   public string[] PropertyA {get; set;}
}

如何查询这个集合,对于 DocumentA,子句是 PropertyA = value,对于 DocumentB,子句是 PropertyA,包含值? Query 需要根据输入值自动生成。

编辑:更新问题内容。

【问题讨论】:

  • 调用者是否有不同的代码路径来确定使用哪种类型?那将是创建两种不同访问模式的地方。

标签: c# .net-core azure-cosmosdb azure-cosmosdb-sqlapi


【解决方案1】:

您可以使用下面的查询。如果 propA 未定义或不是适当的类型,则表达式的一部分将导致 false 并且不会引发任何错误。因此,您可以安全地查询这两种类型。

SELECT * FROM c
WHERE ARRAY_CONTAINS(c.propA, "myValue") OR c.propA = "myValue"

【讨论】:

    【解决方案2】:

    您可以在 Cosmos 中从逻辑上分离您的文档,以确保您查询的是正确的文档。我使用了两种方法:

    • 使用type 属性区分类型
    • 使用类型作为分区键(的/部分)

    在任何一种情况下,您都可以将类型添加为查询的一部分,或者作为 WHERE c.type = 'DocumentA' AND ... <other expressions> 之类的 WHERE 子句,或者在按类型分区时仅使用 SDK 操作中的分区键。

    使用此设置,使用不同的表达式类型查询同名属性没有问题。当然,使用不同的名称可能不会那么混乱。

    【讨论】:

    • 我已经有了这个设置(代码示例只是一个简化版本)我的问题是我的查询必须遍历所有文档类型的整个集合过滤,有点不知道“基数”属性(单个 vs 数组)
    • 我不确定我是否理解您为什么说查询“遍历整个集合”。如果按类型分区,则根据定义,对给定类型分区的查询将是高效的单分区查询。
    猜你喜欢
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 2013-07-31
    • 2021-07-24
    • 2021-06-13
    • 1970-01-01
    • 2018-01-08
    相关资源
    最近更新 更多