【问题标题】:Get the latest document based on a document's property in Azure Cosmos DB根据 Azure Cosmos DB 中文档的属性获取最新文档
【发布时间】:2021-07-31 22:27:43
【问题描述】:

假设我有一个带有 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

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

请注意,我很快就会有很多人会发送很多消息。

【问题讨论】:

  • 鉴于您当前的模型,我看不出您是如何轻松辨别的。
  • 什么是更好的模型?

标签: azure-cosmosdb greatest-n-per-group document-database


【解决方案1】:

常见的模式是有两个集合,一个为 (user, timestamp -> mood) 存储文档,然后一个下游处理器使用 Azure FunctionsChange feed API 直接计算 (user -> latest心情)

[心情时间序列合集] ==> Lambda ==> [最新心情合集]

对于上面的数据流,Latest 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"
}

【讨论】:

  • 感谢您非常清楚的解释。我曾考虑过这样做,但我觉得它会在数据中产生冗余。不过既然没有别的办法,我就没事了。
猜你喜欢
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
相关资源
最近更新 更多