Topic 2 Question 15
7 mins read

Topic 2 Question 15


📌 Giải đề HOTSPOT: Cập nhật trigger để đảm bảo thuộc tính tip tồn tại trong Cosmos DB


1. Phân tích yêu cầu bài toán

Bạn có một dịch vụ web dùng Azure Cosmos DB để lưu trữ dữ liệu.

  • Yêu cầu:
    ✅ Thêm thuộc tính tip vào tài liệu trong Cosmos DB nếu nó không tồn tại.
    ✅ Giá trị tip phải là số (numeric).
    Không làm gián đoạn các ứng dụng hiện có (vì một số ứng dụng chưa được cập nhật để gửi giá trị tip).

Giải pháp: Sử dụng Pre-Trigger trong Azure Cosmos DB để kiểm tra và thêm giá trị tip nếu chưa có.


2. Chọn đúng các thành phần trong trigger

1️⃣ Lấy tài liệu từ Cosmos DB

  • Để truy xuất nội dung của tài liệu, ta sử dụng getContext().getRequest().
var r = getContext().getRequest();

Lệnh này lấy request hiện tại trong Cosmos DB trigger.


2️⃣ Kiểm tra nếu thuộc tính tip không tồn tại hoặc không hợp lệ

  • Chúng ta cần kiểm tra nếu tip không tồn tại hoặc không phải là số.
if (!("tip" in i)) {

Lệnh này kiểm tra nếu tip không có trong tài liệu.

  • Tiếp theo, ta cần đảm bảo tip có giá trị hợp lệ:
if (isNaN(i["tip"]) || i["tip"] === null) {

Điều kiện này kiểm tra nếu tip không phải số hoặc là null.


3️⃣ Gán giá trị mặc định tip = 0 nếu cần thiết

i["tip"] = 0;

Giải pháp này đảm bảo rằng nếu tip không tồn tại hoặc không hợp lệ, nó sẽ được gán giá trị mặc định 0.


4️⃣ Cập nhật tài liệu trong Cosmos DB

  • Chúng ta sử dụng __replaceDocument(i); để cập nhật tài liệu.
__replaceDocument(i);

Lệnh này thay thế tài liệu cũ bằng tài liệu mới đã được cập nhật trong Cosmos DB.


3. Đáp án chính xác

Vị trí trong triggerLựa chọn đúng
Lấy tài liệu từ Cosmos DBgetContext().getRequest();
Kiểm tra nếu tip không tồn tạiif (!("tip" in i)) {
Kiểm tra nếu tip không hợp lệ`if (isNaN(i[“tip”])
Cập nhật tài liệu trong Cosmos DB__replaceDocument(i);

4. Tại sao không chọn các đáp án khác?

Lựa chọn saiLý do không chọn
__value();❌ Không phải cách lấy tài liệu từ Cosmos DB.
__readDocument('item');readDocument chỉ đọc tài liệu nhưng không lấy được context hiện tại.
typeof __.pluck("tip") == "number"❌ Không có phương thức pluck trong Cosmos DB trigger.
r.setValue(i);❌ Không có phương thức setValue() trong Cosmos DB trigger.
__upsertDocument(i);upsertDocument thêm mới tài liệu nhưng không cập nhật tài liệu hiện có.

5. Kết luận

Cách tốt nhất để đảm bảo tip luôn tồn tại và có giá trị số hợp lệ:

  1. Lấy request hiện tại từ Cosmos DBgetContext().getRequest();
  2. Kiểm tra nếu tip không tồn tại hoặc không hợp lệif (!("tip" in i)) {
  3. Gán giá trị mặc định tip = 0 nếu cầni["tip"] = 0;
  4. Cập nhật tài liệu với __replaceDocument(i);

🚀 Cách này đảm bảo tất cả tài liệu trong Cosmos DB luôn có thuộc tính tip, không ảnh hưởng đến ứng dụng hiện có! 🚀


📌 So sánh giữa r.setBody(i);__.replaceDocument(i);


1. Chức năng của từng phương thức

Phương thứcChức năng
r.setBody(i);Thiết lập nội dung phản hồi của request nhưng không cập nhật tài liệu trong Cosmos DB.
__.replaceDocument(i);Cập nhật toàn bộ tài liệu trong Cosmos DB với phiên bản mới đã chỉnh sửa.

2. Lựa chọn nào phù hợp với bài toán?

🛠️ Phân tích yêu cầu

  • Yêu cầu chính: Nếu tài liệu không có thuộc tính tip, cần thêm nó với giá trị mặc định 0.
  • Cách duy nhất để lưu thay đổi trong Cosmos DB: Dùng __.replaceDocument(i); để cập nhật tài liệu.

🚀 Vì sao KHÔNG chọn r.setBody(i);?

  • r.setBody(i); chỉ thay đổi dữ liệu phản hồi, không thực sự lưu tài liệu vào Cosmos DB.
  • Dữ liệu tip sẽ không được lưu vào tài liệu nếu chỉ dùng setBody.

✅ Vì sao chọn __.replaceDocument(i);?

  • __.replaceDocument(i); thay thế tài liệu gốc bằng tài liệu đã chỉnh sửa (có thêm thuộc tính tip nếu trước đó không có).
  • Đây là cách duy nhất để đảm bảo dữ liệu thực sự được lưu lại trong Cosmos DB.

3. Kết luận

👉 Lựa chọn chính xác là:__.replaceDocument(i);
❌ Không chọn r.setBody(i); vì nó chỉ thay đổi phản hồi request chứ không cập nhật dữ liệu trong Cosmos DB.

🚀 Dùng __.replaceDocument(i); để đảm bảo tài liệu trong Cosmos DB luôn có thuộc tính tip hợp lệ! 🚀

Leave a Reply

Your email address will not be published. Required fields are marked *