簡體   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