Class DocumentDb 中的继承

Class inheritance in DocumentDb

我正在尝试找出在 DocumentDb 中建模 class 继承的最佳方法。 假设我的 classes 结构为

class A
 property X
 property Y
 property Z

class B inherits from A
  property W

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

请问下面只查询return个B类型的对象吗?或者它也会考虑基础实例 class A?

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

我使用 node.js 而不是 .NET,所以我不认识 CreateDocumentQuery<B> 语法。有没有一种方法可以检查 .NET SDK 发送的实际查询,以查看 WHERE 子句中是否添加了某些内容以将结果限制为类型 B?或者,是否有像 _Type 这样的字段在没有您干预的情况下添加到您的文档中?我非常怀疑您提供的查询子句是否经过了如此修改。我不太确定没有添加 _Type 字段,但我认为它的可能性小于 50%。我的直觉只是 CreateDocumentQuery 上的 <B> 规范只是为您将返回的对象转换为类型 B。我不知道如果您的结果集包含 class A 对象,或者它是否会使用 null 或其他一些默认值来缺少字段,这是否会导致错误。

假设以上所有情况,您可能必须自己建模 class 层次结构。我用两种不同的方式对此进行了建模:

  1. 使用实体化数组来指示每个文档的整个 class 层次结构。所以,["Animal"、"Mammal"、"Cat"]。然后当你想要所有哺乳动物时,你可以用 WHERE "Mammal" IN c.class.

  2. 查询
  3. 最近,我转而为每种类型设置一个单独的字段。因此,isAnimal = trueisMammal = trueisCat = true。这更像是一种混合方法,但您仍然可以通过这种方式对 class 层次结构进行建模。

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

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

下面的查询只会带回类型B的对象吗?或者它也会考虑基础实例 class A?

DocumentDB 是无模式存储,不存储类型信息。客户端提供的重载泛型方法是语法糖,让您轻松创建查询。 所有查询都是针对 json 文档进行评估的,这些文档没有类型信息。

继承场景

因此,如果您针对仅存在于派生 class 中的 属性 发出查询,您将获得仅与派生 class 相对应的值。但是,如果您要查询的 属性 在基础 class 和派生 class 中,您将得到这两个结果。例如,在你的情况下,过滤 W 只会给你 class B 的结果,但过滤 X, Y or Z 会给你两个 classes 的值AB.

类 在同一集合中具有共享模式

请注意,这不仅仅发生在基础派生的 class 场景中。如果您 有 2 个独立的 classes,它们不会相互继承,但有一个同名的 属性,则会发生相同的行为。查询 属性 将 return 两个 class 的结果。 例如,如果您有 2 个 class 存储在同一个集合中:

class A1 { int x; }
class A2 { int x; }

即使您使用 client.CreateDocumentQuery<A1>(collectionLink) 形成查询,class A 和 B 的结果都将被 return 编辑。正如我之前提到的,客户端中的类型规范只是为了让您在形成查询时更轻松。

我希望能够查询不同类型的数据,具有共享模式元素,存储在同一个集合中 - 我建议使用单独的 属性 来手动存储类型信息并对其进行过滤属性.

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<A1>(collectionLink).Where(d => d.DataType == "A1" && d.x == "xvaluefilter") 现在 return 只有 class A1 的数据。