我有一个在分区集合上执行的查询语句:
var q = this.DocumentClient.CreateDocumentQuery<SomeFoo>(this.collectionUri, query, options).AsDocumentQuery();
尽管在SomeFoo
位中声明CreateDocumentQuery<>
,但结果最终只是尝试反序列化为该类型,无论它们是否属于该类型。
例如,如果我有两个类:
查询类似:query = "select * from items where i.Location = 'New York'"
我将收到SomeFoo
个对象的列表,但实际上有几个对象被SomeBar
个实体塞进SomeFoo
个对象的包络中。换句话说,我会在SomeFoo
对象中看到属性Description和Name为null,但是id / location存在。我将Id视为SomeBar
对象的ID。
如何在不检查随机无关属性的情况下强制查询仅返回特定对象类型?不要将文档存储在某处吗?
答案 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]包含对象类型。