Truy vấn đối tượng lồng nhau phức tạp trong cosmosdb bằng sql Api
Làm cách nào để chỉ truy vấn những người dùng có Itemcount> 10 từ đối tượng lồng nhau phức tạp (có khóa động) từ comosdb bằng sql api? UDF không được ưu tiên.
Cái gì đó như,
Chọn c.username từ c trong đó c.Data [*]. Order.ItemCount> 10;
{
{
"Username": "User1",
"Data": {
"RandomGUID123": {
"Order": {
"Item": "ItemName123",
"ItemCount" : "40"
},
"ShipmentNumber": "7657575"
},
"RandomGUID976": {
"Order": {
"Item": "ItemName7686"
"ItemCount" : "7"
},
"ShipmentNumber": "876876"
}
}
},
{
"Username": "User2",
"Data": {
"RandomGUID654": {
"Order": {
"Item": "ItemName654",
"ItemCount" : "9"
},
"ShipmentNumber": "7612575"
},
"RandomGUID908": {
"Order": {
"Item": "ItemName545"
"ItemCount" : "6"
},
"ShipmentNumber": "6454"
}
}
}
}
Trả lời
Tôi không chắc về cách xử lý các khóa không xác định, nhưng nếu bạn sẵn sàng lập mô hình khóa dưới dạng một giá trị thay thế (tôi cho rằng đơn giản hơn và rõ ràng hơn), bạn có thể có:
{
"Username": "User1",
"Data": [
{
"Id": "RandomGUID123",
"Order": {
"Item": "ItemName123",
"ItemCount": 40
},
"ShipmentNumber": "7657575"
},
{
"Id": "RandomGUID976",
"Order": {
"Item": "ItemName7686",
"ItemCount": 7
},
"ShipmentNumber": "876876"
}
]
}
Với một truy vấn như:
SELECT DISTINCT VALUE(c.Username)
FROM c
JOIN (SELECT VALUE d from d IN c.Data where d["Order"].ItemCount > 10)
Kết quả:
[
"User1"
]
"Order" là một từ khóa dành riêng và yêu cầu cú pháp ngoặc để tham chiếu.
Như Noah trả lời, mô hình hóa chìa khóa như một giá trị là một cách để đạt được.
Ngoài ra, có một cách khác để đạt được mà không cần thay đổi lược đồ tài liệu của bạn. Tạo UDF như sau:
function getResult(data){
for(var key in data){
const itemCount = data[key].Order.ItemCount;
if (parseFloat(itemCount).toString() != "NaN" && parseFloat(itemCount) > 10 ) {
return true;
}
}
return false;
}
Sau đó chạy sql này:
SELECT c.Username FROM c where udf.getResult(c.Data)
Kết quả:
[
{
"Username": "User1"
}
]