Cosmos DB 在没有分区键的情况下读取单个文档
Cosmos DB read a single document without partition key
容器有一个名为 ReadItemAsync 的函数。问题是我没有分区键,只有文档的 ID。那么只获得一件商品的最佳方法是什么?
我必须从 collection 那里得到它吗?喜欢:
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);
}
}
作为答案发布。
是的,您必须进行扇出查询,但每个分区键的 ID 仅不同,因此即使这样您最终也可能会得到多个项目。坦率地说,如果您没有读取点的分区键,那么数据库的模型是不正确的。它(或应用程序本身)应该重新设计。
另外。对于小型单分区集合,此 x 分区查询不会太昂贵,因为集合很小。然而,一旦数据库开始横向扩展,这将变得越来越慢且成本越来越高,因为查询将散开到越来越多的物理分区。如上所述,我强烈建议您修改应用程序以在请求中传递分区键值。这将允许您执行非常快速和高效的单点读取操作。
祝你好运。
容器有一个名为 ReadItemAsync 的函数。问题是我没有分区键,只有文档的 ID。那么只获得一件商品的最佳方法是什么?
我必须从 collection 那里得到它吗?喜欢:
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);
}
}
作为答案发布。
是的,您必须进行扇出查询,但每个分区键的 ID 仅不同,因此即使这样您最终也可能会得到多个项目。坦率地说,如果您没有读取点的分区键,那么数据库的模型是不正确的。它(或应用程序本身)应该重新设计。
另外。对于小型单分区集合,此 x 分区查询不会太昂贵,因为集合很小。然而,一旦数据库开始横向扩展,这将变得越来越慢且成本越来越高,因为查询将散开到越来越多的物理分区。如上所述,我强烈建议您修改应用程序以在请求中传递分区键值。这将允许您执行非常快速和高效的单点读取操作。
祝你好运。