Cosmos DB:将对象类型保存为文档中的属性

时间:2017-12-07 07:29:04

标签: azure azure-cosmosdb

我想将对象保存到cosmos db中时将对象类型保存为json对象的一部分。我在尝试实例化Cosmos Client的实例时尝试传递json序列化程序,但它不起作用。我仍然没有看到文档中的对象类型。 我想做什么:

    public static readonly JsonSerializerSettings DefaultJsonSerializerSettings =
        new JsonSerializerSettings
        {
            TypeNameHandling = TypeNameHandling.All,
            DateFormatString = "o",
            DateFormatHandling = DateFormatHandling.IsoDateFormat,
        }; 

    var CosmosClient =
            new DocumentClient(
                new Uri(CosmosConfig.ServiceEndpoint),
                CosmosConfig.AuthNKey,
                DefaultJsonSerializerSettings,
                connectionPolicySettings);

没有预处理(将对象转换为jObject)的任何其他方式有这样的行为吗? 感谢

UPD:

我想要实现的是像我的文档中的下一个结构(自动序列化类型):

    {
      "$type" : "MyNamespace.Foo",
      "Id": "1560e1be-bf87-4720-a22e-b7e2c4c37f2e",
      "Name" : "Vasia"
    }

而不是像这样的当前(没有类型):

    {
      "Id": "1560e1be-bf87-4720-a22e-b7e2c4c37f2e",
      "Name" : "Vasia"
    }

2 个答案:

答案 0 :(得分:3)

使用Cosmos DB时,我经常让我的文档/类从类似于此的抽象基类继承:

public abstract class DocModel
{
    [JsonProperty(PropertyName = "$type")]
    public virtual string Doctype => GetType().Name;

    [JsonProperty(PropertyName = "id")]
    public string Id { get; set; }
}

它几乎可以满足您的需求:

public class Cloud : DocModel
{
    public string Name { get; set; }
}

public class Foo : DocModel
{
    public string Name { get; set; }
}

最终会成为

{
   "$type":"Cloud",
   "id": "1560e1be-bf87-4720-a22e-b7e2c4c37f2e",
   "name" : "Vasia"
}

{
   "$type":"Foo",
   "id": "2560e1be-bf87-4720-a22e-b7e2c4c37f2e",
   "name" : "Vasia2"
}

您可以将Doctype属性更改为GetType()。FullName等以获取名称空间等。

这也允许您根据Doctype查询所有文档,如:

   var t = typeof(T).Name;
   IDocumentQuery<T> query = _db.Client
            .CreateDocumentQuery<T>(_db.CollectionUri, new FeedOptions { MaxItemCount = -1 })
            .Where(predicate)
            .Where(_ => _.Doctype == t)
            .AsDocumentQuery();

例如,在通用存储库中使用。

答案 1 :(得分:2)

根据我的理解,您的意思是说您想要识别客户,卖方等实体的类型。

如果是这样,我想通知您,Cosmos DB是架构较少的数据库,因此您不能以Customer等格式使用它。如果您确实需要识别Cosmos DB中的对象类型,则必须在要保存的对象或实体中添加一个属性,如Type =“Customer”或Type =“Employee”,因为DocumentDB中的所有对象都存储在类似的形式,就是JSON,没有像SQL中的客户/员工表这样的概念。

如果对你有帮助,别忘了给我答案。