Azure cosmosdb Cosmos DB不使用分区键读取单个文档

Azure cosmosdb Cosmos DB不使用分区键读取单个文档,azure-cosmosdb,azure-cosmosdb-sqlapi,Azure Cosmosdb,Azure Cosmosdb Sqlapi,容器有一个名为ReadItemAsync的函数。问题是我没有分区键,只有文档的id。那么,获得单一商品的最佳方法是什么 我必须从收藏品中得到它吗?比如: var allItemsQuery = VesselContainer.GetItemQueryIterator<CoachVessel>("SELECT * FROM c where c.id=...."); var q = VesselContainer.GetItemLinqQueryable<Co

容器有一个名为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);
    }
}
var allItemsQuery=VesselContainer.GetItemQueryIterator(“从c中选择*,其中c.id=…);
var q=VesselContainer.GetItemLinqQueryable();
var iterator=q.ToFeedIterator();
var result=新列表();
while(iterator.HasMoreResults)
{
foreach(wait iterator.ReadNextAsync()中的var项)
{
结果.添加(项目);
}
}
作为答案发布


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

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

祝你好运。

作为答案发布


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

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


祝您好运。

是的,您必须进行扇出查询,但id仅在每个分区键上是不同的,因此即使这样,您也可能会得到多个项。坦率地说,如果您没有用于点读取的分区键,那么数据库的模型是不正确的。它应该重新设计。不幸的是,数据来自外部API,我不能要求他们重新设计。但是谢谢你的回复。您是否可以创建一个回答,说明没有分区键无法执行此操作。是的,您必须执行扇出查询,但id仅在每个分区键上是不同的,因此即使这样,您也可能会得到多个项。坦率地说,如果您没有用于点读取的分区键,那么数据库的模型是不正确的。它应该重新设计。不幸的是,数据来自外部API,我不能要求他们重新设计。但是谢谢你的回复。你能不能创建一个答案,说明没有分区键是不可能的。谢谢!我没有意识到在请求中传递分区键是一种好的做法,但我仍然不确定是否选择分区键。当您想要检索集合中的单个项时,您怎么可能总是知道分区键呢?理想情况下,分区键应该是数据本身固有的。例如,在查找客户时,理想情况下,您应该使用与该客户相关联的一些数据。也许是电话号码,也许是别的什么。如果您对此类数据库的数据建模还不熟悉,我绝对建议您阅读本文。大多数人在阅读时都会有一个“啊哈”的时刻@谢谢你的链接,真的很好。它教导我们不要害怕去规范化,这是“丑陋的”(对我来说,这是非常丑陋的)。谢谢!我没有意识到在请求中传递分区键是一种好的做法,但我仍然不确定是否选择分区键。当您想要检索集合中的单个项时,您怎么可能总是知道分区键呢?理想情况下,分区键应该是数据本身固有的。例如,在查找客户时,理想情况下,您应该使用与该客户相关联的一些数据。也许是电话号码,也许是别的什么。如果您对此类数据库的数据建模还不熟悉,我绝对建议您阅读本文。大多数人在阅读时都会有一个“啊哈”的时刻@谢谢你的链接,真的很好。它教导我们不要害怕去规范化,这是“丑陋的”(对我来说,这是非常丑陋的)。