繁体   English   中英

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

[英]How To: Get latest (newest) document from Cosmos DB?

我有一个文档数据库,它具有各种属性,包括一个名为“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)文档数据库中请求单个文档,基于诸如聚合 function(例如 Max)之类的东西,而无需遍历整个结果集。 不幸的是,我找不到一个可行的例子。

谢谢!

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

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

另一个可行的选择是使用具有设备 id 的复合索引和具有 Desc 顺序的 SensorCaptureTime,然后在集合上执行 Top 1 以插入最后一个项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM