รับเอกสารล่าสุดตามคุณสมบัติของเอกสารใน 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 หรือ เปลี่ยน feed API โดยตรงที่คำนวณ (ผู้ใช้ -> อารมณ์ล่าสุด)

[คอลเลกชันซีรีส์อารมณ์เวลา] ==> แลมบ์ดา ==> [คอลเลกชันซีรีส์อารมณ์ล่าสุด]

และคอลเลกชันอารมณ์ล่าสุดจะมีลักษณะเช่นนี้สำหรับสตรีมข้อมูลด้านบน จากนั้นคุณใช้สิ่งนี้สำหรับการค้นหาของคุณ (ซึ่งตอนนี้เป็นการค้นหาที่สำคัญ)

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