[英]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.