DocumentDb CreateDocumentQuery<T> 区分对象类型

DocumentDb CreateDocumentQuery<T> to differentiate object types

我有一个在分区集合上执行的查询语句:

     var q = this.DocumentClient.CreateDocumentQuery<SomeFoo>(this.collectionUri, query, options).AsDocumentQuery();

尽管在 CreateDocumentQuery<> 位中声明了 SomeFoo,但结果最终只是尝试反序列化为该类型,无论它们是否是该类型。

例如,如果我有两个 类:

  1. SomeFoo:{ID、名称、描述、位置 (PKEY)}
  2. SomeBar:{ID、职位、传记、位置 (PKEY)}

并查询类似:query = "select * from items where i.Location = 'New York'"

我会收到一份 SomeFoo 对象的列表,但其中有几个对象实际上是 SomeBar 实体,它们被塞进了 SomeFoo 对象的包络中。换句话说,我将看到属性 Description 和 Name 在 SomeFoo 对象中为 null,但存在 id/location。我将 Id 识别为 SomeBar 对象的 Id。

如何强制查询仅 return 特定对象类型而不检查随机无关属性?文档没有在某处存储它们的对象类型吗?

这就是它被称为 "schemaless" DB 的原因。您可以只存储任何有效的 JSON 文档。 DocumentDB 在后台使用 Json.NET serialization/deserialization,您可以强制包含这样的对象类型:

[JsonProperty(PropertyName = "something"", ItemTypeNameHandling = TypeNameHandling.Auto, TypeNameHandling = TypeNameHandling.Auto)]
public BaseSomething Something { get; set; }

JSON 看起来像这样:

"$something": "MyLibrary.Entities.Foo, MyLibrary",
"something": ...,

基本上 $[field] 由对象类型组成。

我发现的最简单的方法就是确保您的文档具有可用于过滤的 DocType 属性。如果您习惯于关系数据库,感觉有点不对劲,因为您的实体将被命名为表。但这是通过减少模式获得的灵活性。您的数据存储只知道文档。时期。的确,在大多数 nosql 数据库中您可以拥有不同类型的文档,但这些类型不会映射到您的域类型。它们可能类似于 JsonDocument 或 ImageDocument 或类似的。最终,只需强制执行一个字段来跟踪类型就非常容易,而且不会造成太大影响。类似于:

public interface IDocumentModel
    {
        string Id { get; set; }
        string DocType { get; }
        DateTime CreatedOn {get; set;}
    } 

然后你可以查询你想要的类型。我们使用 couchbase,type 字段在内部也很有用,可以帮助为各种域类型建立索引。