Membuat kueri objek bersarang yang kompleks di cosmosdb menggunakan api sql
Bagaimana query hanya pengguna yang Itemcount> 10 dari objek bersarang kompleks (dengan kunci dinamis) dari comosdb menggunakan sql api? UDF tidak disukai.
Sesuatu seperti,
Pilih c.username dari c dimana 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"
}
}
}
}
Jawaban
Saya tidak yakin tentang cara menangani kunci yang tidak diketahui, tetapi jika Anda ingin memodelkan kunci sebagai nilai (lebih sederhana dan lebih bersih menurut saya), Anda dapat memiliki:
{
"Username": "User1",
"Data": [
{
"Id": "RandomGUID123",
"Order": {
"Item": "ItemName123",
"ItemCount": 40
},
"ShipmentNumber": "7657575"
},
{
"Id": "RandomGUID976",
"Order": {
"Item": "ItemName7686",
"ItemCount": 7
},
"ShipmentNumber": "876876"
}
]
}
Dengan pertanyaan seperti:
SELECT DISTINCT VALUE(c.Username)
FROM c
JOIN (SELECT VALUE d from d IN c.Data where d["Order"].ItemCount > 10)
Hasil:
[
"User1"
]
"Order" adalah kata kunci yang dipesan dan membutuhkan sintaks braket sebagai referensi.
Seperti jawaban Nuh, mencontohkan kunci sebagai nilai adalah cara untuk mencapai.
Selain itu, ada cara lain untuk melakukannya tanpa mengubah skema dokumen Anda. Buat UDF seperti ini:
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;
}
Kemudian jalankan sql ini:
SELECT c.Username FROM c where udf.getResult(c.Data)
Hasil:
[
{
"Username": "User1"
}
]