我有一个文档数据库,该数据库具有各种属性,包括一个名为“ SensorCaptureTime”的属性。我只想基于此属性检索最新文档。到目前为止,我只想出了如何检索按SensorCaptureTime排序的所有文档,然后遍历它们以获取列表中的最后一个文档。这是我当前的代码:
SensorData mostRecentSensorReadingDocument = null;
// TODO: There has to be a better way to do this... just not sure what it is yet :-)
var queryable = documentClient.CreateDocumentQuery<SensorData>(
collectionUri,
new FeedOptions { MaxItemCount = -1, EnableCrossPartitionQuery = true })
.OrderBy(b => b.SensorCaptureTime)
.AsDocumentQuery();
while (queryable.HasMoreResults)
{
foreach (SensorData sensorReadingsDocument in await queryable.ExecuteNextAsync<SensorData>())
{
mostRecentSensorReadingDocument = sensorReadingsDocument;
}
}
return mostRecentSensorReadingDocument;
我假设有一种方法可以基于诸如(Cosmos)文档数据库中的聚合函数(例如Max)之类的东西来请求单个文档,而不必遍历整个结果集。不幸的是,我无法找到一个可行的例子。
谢谢!
答案 0 :(得分:1)
是整个数据库中只有一种吗?还是每个写入数据的设备都只有一种?
在任何一种情况下,这种方法的问题在于,随着时间的推移,查询将变得越来越昂贵和缓慢,尤其是在这是跨分区查询时。更好的方法可能是使用“更改摘要”并为每个包含最新读数的设备更新仅包含单个记录的另一个集合。每当将新的读数插入Cosmos DB中时,便会触发Change Feed,然后您将读取Change feed并对第二个集合进行Upsert,以使用最新的读数更新相关记录。这样,每次您需要该值时,它都是点读操作,非常高效。
另一个可行的选择是使用设备ID和SensorCaptureTime(按Desc顺序)的复合索引,然后对集合进行Top 1处理以获取插入的最后一项。