Получите последний документ на основе свойства документа в Azure Cosmos DB.

Допустим, у меня есть коллекция Cosmos DB с SQL API, которая содержит список сообщений, отправленных людьми, с указанием их текущего настроения и отметкой времени получения сообщения. Люди могут отправлять сообщения, когда захотят.

В моей коллекции есть что-то вроде этого:

[
    {
      "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

Но я чувствую, что перебор всех моих пользователей и выполнение запроса для каждого может быть очень расточительным по ресурсам и быстро стать дорогим, но я не могу найти способ, который будет работать.

Отмечу, что у меня скоро появится много людей, которые будут отправлять много сообщений.


person Gimly    schedule 16.02.2018    source источник
comment
Учитывая вашу текущую модель, я не понимаю, как вы можете легко это различить.   -  person David Makogon    schedule 17.02.2018
comment
Какая модель лучше для этого?   -  person Gimly    schedule 17.02.2018


Ответы (1)


Обычный шаблон для этого состоит в том, чтобы иметь две коллекции, одна из которых хранит документы для (пользователь, отметка времени -> настроение), а затем подчиненный процессор, использующий Функции Azure или Изменить API канала напрямую, который вычисляет (пользователь -> последнее настроение)

[Коллекция серии Mood Time] ==> Lambda ==> [Последняя коллекция Mood]

И последняя коллекция настроения будет выглядеть примерно так для потока данных выше. Затем вы используете это для поиска (теперь это ключевой поиск).

{
  "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"
}
person Aravind Krishna R.    schedule 17.02.2018
comment
Спасибо за очень понятное объяснение. Я думал об этом, но чувствовал, что это создаст избыточность данных. Но так как другого пути нет, то меня это устраивает. - person Gimly; 22.02.2018