Cosmos DB 在没有分区键的情况下读取单个文档

问题描述 投票:0回答:2

容器有一个名为 ReadItemAsync 的函数。问题是我没有分区键,只有文档的 ID。那么获得单个物品的最佳方法是什么?

我必须从收藏中获取它吗?喜欢:

var allItemsQuery = VesselContainer.GetItemQueryIterator<CoachVessel>("SELECT * FROM c where c.id=....");

var q = VesselContainer.GetItemLinqQueryable<CoachVessel>();
var iterator = q.ToFeedIterator();

var result = new List<CoachVessel>();
while (iterator.HasMoreResults)
{
    foreach (var item in await iterator.ReadNextAsync())
    {
        result.Add(item);
    }
}
azure-cosmosdb azure-cosmosdb-sqlapi
2个回答
9
投票

发布为答案。

是的,您必须执行扇出查询,但 id 仅每个分区键不同,因此即使如此,您最终也可能会得到多个项目。坦率地说,如果您没有读取点的分区键,则数据库的模型不正确。它(或应用程序本身)应该重新设计。

另外。对于小型的单分区集合,此 x 分区查询不会太昂贵,因为集合很小。然而,一旦数据库开始横向扩展,速度就会变得越来越慢,而且成本也会越来越高,因为查询将分散到越来越多的物理分区。如上所述,我强烈建议您修改应用程序以在请求中传递分区键值。这将允许您执行非常快速且高效的单点读取操作。

祝你好运。


1
投票

尝试使用

ReadItemAsync
,例如:

dynamic log = await container.ReadItemAsync<dynamic>(ID, PartitionKey.None);
© www.soinside.com 2019 - 2024. All rights reserved.