DocumentDb CreateDocumentQuery <t>以区分对象类型

时间:2017-01-25 20:14:54

标签: c# .net azure-cosmosdb

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

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

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

例如,如果我有两个类:

  1. SomeFoo:{Id,Name,Description,Location(PKEY)}
  2. SomeBar:{Id,Title,Biography,Location(PKEY)}
  3. 查询类似:query = "select * from items where i.Location = 'New York'"

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

    如何在不检查随机无关属性的情况下强制查询仅返回特定对象类型?不要将文档存储在某处吗?

2 个答案:

答案 0 :(得分:1)

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

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

然后您可以查询所需类型。我们使用couchbase,type字段在内部也很有用,可以帮助构建各种域类型的索引。

答案 1 :(得分:-2)

这就是为什么它被称为“无模式”数据库。您只需存储任何有效的JSON文档即可。 DocumentDB使用Json.NET后台场景进行序列化/反序列化,你可以强制包含这样的对象类型:

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

JSON看起来像这样:

sprintf()

基本上$ [field]包含对象类型。