Dapatkan dokumen terbaru berdasarkan properti dokumen di Azure Cosmos DB

Katakanlah saya memiliki koleksi Cosmos DB dengan SQL API yang berisi daftar pesan yang telah dikirim orang-orang yang memberikan suasana hati mereka saat ini dan stempel waktu kapan pesan tersebut diterima. Orang dapat mengirim pesan kapan pun mereka mau.

Dalam koleksi saya, saya memiliki sesuatu yang terlihat seperti ini:

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

Saya ingin mengirim pertanyaan yang mendapatkan suasana hati "saat ini" dari semua pengguna yang mengirim pesan (pesan terbaru diterima untuk semua orang).

Hal ini relatif mudah dilakukan untuk setiap pengguna tertentu, dengan menggabungkan TOP 1 dan ORDER BY

SELECT TOP 1 *
FROM C
WHERE C.PersonName = "John"
ORDER BY C.TimeStamp

Namun saya merasa mengulangi semua pengguna saya dan menjalankan kueri untuk masing-masing pengguna mungkin akan sangat membuang-buang sumber daya dan menjadi mahal dengan cepat, tetapi saya tidak dapat menemukan cara yang berhasil.

Perlu diketahui bahwa saya akan segera memiliki banyak orang yang akan mengirim banyak pesan.


person Gimly    schedule 16.02.2018    source sumber
comment
Mengingat model Anda saat ini, saya tidak melihat bagaimana Anda dapat dengan mudah membedakannya.   -  person David Makogon    schedule 17.02.2018
comment
Model apa yang lebih baik untuk ini?   -  person Gimly    schedule 17.02.2018


Jawaban (1)


Pola umum untuk hal ini adalah memiliki dua koleksi, satu yang menyimpan dokumen untuk (pengguna, stempel waktu -> suasana hati), kemudian prosesor hilir menggunakan Azure Functions atau Ubah API feed secara langsung yang menghitung (pengguna -> mood terbaru)

[Koleksi Mood Time series] ==> Lambda ==> [Koleksi Mood Terbaru]

Dan Kumpulan Mood Terbaru akan terlihat seperti ini untuk aliran data di atas. Anda kemudian menggunakan ini untuk pencarian Anda (yang sekarang menjadi pencarian kunci).

{
  "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
Terima kasih atas penjelasannya yang sangat jelas. Saya sempat berpikir untuk melakukan hal ini, namun saya merasa hal ini akan menyebabkan redundansi pada data. Tapi karena tidak ada cara lain, aku baik-baik saja. - person Gimly; 22.02.2018