根据Azure Cosmos DB中文档的属性获取最新文档

时间:2018-02-16 20:38:41

标签: azure-cosmosdb document-database

假设我有一个带有SQL API的Cosmos DB集合,其中包含人们发送的消息列表,这些消息提供了当前的情绪以及消息收到时的时间戳。人们可以随时发送消息。

在我的收藏中,我有一些看起来像这样的东西:

[
    {
      "PersonName": "John",
      "CurrentMood": "Moody",
      "TimeStamp": "2012-04-23T18:25:43.511Z",
      "id": "25123829-1745-0a09-5436-9cf8bdcc95e3"
    },
    {
      "PersonName": "Jim",
      "CurrentMood": "Happy",
      "TimeStamp": "2012-05-23T17:25:43.511Z",
      "id": "6feb7b41-4b85-164e-dcd4-4e078872c5e2"
    },
    {
      "PersonName": "John",
      "CurrentMood": "Moody",
      "TimeStamp": "2012-05-23T18:25:43.511Z",
      "id": "b021a4a5-ee92-282c-0fe0-b5d6c27019af"
    },
    {
      "PersonName": "Don",
      "CurrentMood": "Sad",
      "TimeStamp": "2012-03-23T18:25:43.511Z",
      "id": "ee72cb36-4304-06e5-ed7c-1d0ff890de48"
    }
]

我想发送一个查询,以获取所有发送消息的用户的“当前”情绪(收到给所有人的最新消息)。

通过组合TOP 1和ORDER BY

,对每个特定用户来说相对容易
SELECT TOP 1 *
FROM C
WHERE C.PersonName = "John"
ORDER BY C.TimeStamp

但我觉得循环遍历所有用户并为每个用户运行查询可能会非常浪费资源并且很快变得昂贵,但我找不到可行的方法。

要注意我很快会有很多人发送大量信息。

1 个答案:

答案 0 :(得分:1)

这方面的常见模式是有两个集合,一个用于存储(用户,时间戳 - &>心情)的文档,然后是使用Azure Functions的下游处理器或直接计算的Change feed API (用户 - >最新情绪)

[心情时间系列收藏] ==> Lambda ==> [最新情绪收藏]

对于上面的数据流,最新的Mood Collection看起来像这样。然后将其用于查找(现在是关键查找)。

{
  "PersonName": "Jim",
  "LatestMood": "Happy",
  "LatestTimeStamp": "2012-05-23T17:25:43.511Z",
  "id": "6feb7b41-4b85-164e-dcd4-4e078872c5e2"
},
{
  "PersonName": "John",
  "LatestMood": "Moody",
  "LatestTimeStamp": "2012-05-23T18:25:43.511Z",
  "id": "b021a4a5-ee92-282c-0fe0-b5d6c27019af"
},
{
  "PersonName": "Don",
  "LatestMood": "Sad",
  "LatestTimeStamp": "2012-03-23T18:25:43.511Z",
  "id": "ee72cb36-4304-06e5-ed7c-1d0ff890de48"
}