gpt4 book ai didi

azure-cosmosdb - 处理多种类型的 Cosmos DB 容器的读取?

转载 作者:行者123 更新时间:2023-12-05 02:01:20 25 4
gpt4 key购买 nike

我想将几种不同的对象类型存储在一个 Cosmos DB 容器中,因为它们都在逻辑上分组并且可以按时间戳一起读取以避免额外的 HTTP 调用。

但是,Cosmos DB 客户端 API 似乎没有提供一种简单的方法来读取多种类型。到目前为止,我找到的最佳解决方案是编写您自己的 CosmosSerializer 和 JsonConverter,但这感觉很笨拙:https://thomaslevesque.com/2019/10/15/handling-type-hierarchies-in-cosmos-db-part-2/

是否有更优雅的方式将不同类型的项目读取到共享基类,以便我可以稍后转换它们,还是我必须接受打击?

谢谢!

最佳答案

我这样做的方法是将 ItemQueryIterator 和 FeedResponse 对象创建为动态对象,并最初以非类型化方式读取它们,这样我就可以检查一个“类型”属性,该属性告诉我要反序列化为什么类型的对象。

在此示例中,我有一个容器,其中包含我的客户数据及其所有销售订单。代码如下所示。

        string sql = "SELECT * from c WHERE c.customerId = @customerId";

FeedIterator<dynamic> resultSet = container.GetItemQueryIterator<dynamic>(
new QueryDefinition(sql)
.WithParameter("@customerId", customerId),
requestOptions: new QueryRequestOptions
{
PartitionKey = new PartitionKey(customerId)
});

CustomerV4 customer = new CustomerV4();
List<SalesOrder> orders = new List<SalesOrder>();

while (resultSet.HasMoreResults)
{
//dynamic response. Deserialize into POCO's based upon "type" property
FeedResponse<dynamic> response = await resultSet.ReadNextAsync();
foreach (var item in response)
{
if (item.type == "customer")
{
customer = JsonConvert.DeserializeObject<CustomerV4>(item.ToString());

}
else if (item.type == "salesOrder")
{
orders.Add(JsonConvert.DeserializeObject<SalesOrder>(item.ToString()));
}
}
}

更新:

如果要创建“基本文档”类然后从中派生,则不必使用动态类型。反序列化到 documentBase 类,然后检查 type 属性检查将有效负载反序列化到哪个类。

当您使用 docVersion 属性随时间发展您的数据模型时,您也可以扩展此模式。

enter image description here

关于azure-cosmosdb - 处理多种类型的 Cosmos DB 容器的读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66659540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com