如何:从Cosmos DB获取最新(最新)文档?

时间:2020-07-25 18:25:18

标签: c# azure-cosmosdb

我有一个文档数据库,该数据库具有各种属性,包括一个名为“ 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)之类的东西来请求单个文档,而不必遍历整个结果集。不幸的是,我无法找到一个可行的例子。

谢谢!

1 个答案:

答案 0 :(得分:1)

是整个数据库中只有一种吗?还是每个写入数据的设备都只有一种?

在任何一种情况下,这种方法的问题在于,随着时间的推移,查询将变得越来越昂贵和缓慢,尤其是在这是跨分区查询时。更好的方法可能是使用“更改摘要”并为每个包含最新读数的设备更新仅包含单个记录的另一个集合。每当将新的读数插入Cosmos DB中时,便会触发Change Feed,然后您将读取Change feed并对第二个集合进行Upsert,以使用最新的读数更新相关记录。这样,每次您需要该值时,它都是点读操作,非常高效。

另一个可行的选择是使用设备ID和SensorCaptureTime(按Desc顺序)的复合索引,然后对集合进行Top 1处理以获取插入的最后一项。