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

Tho*_*ato 5 azure-cosmosdb azure-cosmosdb-sqlapi

容器有一个名为 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*own 9

作为答案发布。

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

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

祝你好运。

  • 理想情况下,分区键应该是数据本身固有的。例如,在查找客户时,您最好使用与该客户相关的一些数据。也许是电话号码,也许是其他东西。如果您不熟悉此类数据库的数据建模,我绝对建议您阅读本文。大多数人读到它时都会有一个“啊哈”的时刻。https://learn.microsoft.com/en-us/azure/cosmos-db/how-to-model-partition-example (3认同)