

📌 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ínhtip
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 trigger | Lựa chọn đúng |
---|---|
Lấy tài liệu từ Cosmos DB | getContext().getRequest(); |
Kiểm tra nếu tip không tồn tại | if (!("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 sai | Lý 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ệ:
- Lấy request hiện tại từ Cosmos DB →
getContext().getRequest();
- Kiểm tra nếu
tip
không tồn tại hoặc không hợp lệ →if (!("tip" in i)) {
- Gán giá trị mặc định
tip = 0
nếu cần →i["tip"] = 0;
- 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);
và __.replaceDocument(i);
1. Chức năng của từng phương thức
Phương thức | Chứ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 định0
. - 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ùngsetBody
.
✅ 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ínhtip
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ệ! 🚀