Azure cosmosdb DocumentDb中的类继承

Azure cosmosdb DocumentDb中的类继承,azure-cosmosdb,Azure Cosmosdb,我试图找出在DocumentDb中建模类继承的最佳方法。 假设我的课程结构如下 class A property X property Y property Z class B inherits from A property W 是否有内置的支持来处理此问题?如果我在客户端代码中使用Lambda表达式,它是否能够自动区分b/w类型 下面的查询是否只返回类型为B的对象?还是会考虑基类A的实例? var bCollection = from o in client.CreateDoc

我试图找出在DocumentDb中建模类继承的最佳方法。 假设我的课程结构如下

class A
 property X
 property Y
 property Z

class B inherits from A
  property W
是否有内置的支持来处理此问题?如果我在客户端代码中使用Lambda表达式,它是否能够自动区分b/w类型

下面的查询是否只返回类型为B的对象?还是会考虑基类A的实例?

var bCollection = from o in client.CreateDocumentQuery<B>(collectionLink)
                  where X > 2

                  select o;
var bCollection=来自client.CreateDocumentQuery(collectionLink)中的o
其中X>2
选择o;

我使用的是node.js而不是.NET,因此我无法识别
CreateDocumentQuery
语法。是否有方法检查.NET SDK发送的实际查询,以查看是否有添加到WHERE子句的内容将结果限制为B类型?或者,是否有一些字段如
\u Type
添加到文档中而不需要您的干预?我非常怀疑你提供的查询条款被如此修改。我不太确定没有添加<代码>类型> <代码>字段,但我认为它不太可能是50%。我的直觉是,
CreateDocumentQuery
上的
规范只是为您将返回的对象强制转换为类型B。我不知道如果结果集包含class A对象,这是否会导致错误,或者它是否会对缺少的字段使用null或其他默认值

假设所有这些,您可能需要自己建模类层次结构。我以两种不同的方式对此进行建模:

  • 使用物化数组来指示每个文档的整个类层次结构。所以,[“动物”、“哺乳动物”、“猫”]。然后,当您需要所有哺乳动物时,您可以使用
    查询c.class中“哺乳动物”的位置

  • 最近,我已经切换到为每种类型的内容设置一个单独的字段。因此,
    isAnimal=true
    isamimal=true
    ,以及
    isCat=true
    。这更像是一种mixin方法,但您仍然可以通过这种方式对类层次结构进行建模


  • 是否有内置的支持来处理此问题?如果我在客户端代码中使用Lambda表达式,它是否能够自动区分b/w类型?

    是的,您可以在客户端使用lambda语法,只要在泛型方法中指定特定类型,如
    client.CreateDocumentQuery(collectionLink)

    下面的查询是否只返回类型为B的对象?也会考虑基类A的实例吗?< /强>

    DocumentDB是无模式存储,不存储类型信息。客户端中提供的重载泛型方法是语法糖,可以让您轻松创建查询。 所有查询都是根据没有类型信息的json文档进行计算的

    继承场景

    因此,如果对仅存在于派生类中的属性发出查询,则将获得仅与派生类对应的值。但是,如果要查询的属性同时位于基类和派生类中,则会返回这两个结果。例如,在您的情况下,在
    W
    上过滤只会给出类
    B
    的结果,但在
    X、Y或Z
    上过滤会给出类
    A
    B
    的值

    在同一集合中具有共享架构的类

    请注意,这不仅仅发生在基类派生的场景中。如果有两个独立的类,它们彼此不继承,但具有相同名称的属性,则会发生相同的行为。查询该属性将返回两个类的结果。 例如,如果有两个类存储在同一集合中:

    class A1 { int x; }
    class A2 { int x; }
    
    即使您使用
    客户端.CreateDocumentQuery(collectionLink)
    形成查询,也会返回A类和B类的结果。正如我前面提到的,客户机中的类型规范只是为了在形成查询时使您的工作更轻松

    我希望您能够查询存储在同一集合中的具有共享模式元素的不同类型的数据——我建议使用单独的属性手动存储类型信息,并对该属性进行筛选

    class DocumentDbData 
    { 
        string DataType; 
    
        DocumentDbData(string type) { DataType = type;}
    
    }
    class A1 : DocumentDbData 
    {
        string x;
        A1() : base("A1")
    }
    class A2 : DocumentDbData 
    {
        string x;
        A2() : base("A2")
    }
    

    查询,
    client.CreateDocumentQuery(collectionLink).Where(d=>d.DataType==“A1”和&d.x==“xvaluefilter”)
    现在将只返回A1类的数据。

    非常感谢Arnab的详细解释。感谢Larry,这肯定非常有用。