การค้นหาวัตถุที่ซ้อนกันที่ซับซ้อนใน cosmosdb โดยใช้ sql Api
Aug 17 2020
วิธีค้นหาเฉพาะผู้ใช้ที่ Itemcount> 10 จากวัตถุซ้อนที่ซับซ้อน (พร้อมคีย์ไดนามิก) จาก comosdb โดยใช้ sql api ไม่แนะนำให้ใช้ UDF
สิ่งที่ต้องการ,
เลือก c.username จาก c โดยที่ c.Data [*]. Order.IemCount> 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"
}
}
}
}
คำตอบ
NoahStahl Aug 17 2020 at 23:10
ฉันไม่แน่ใจเกี่ยวกับวิธีจัดการคีย์ที่ไม่รู้จัก แต่ถ้าคุณยินดีที่จะจำลองคีย์เป็นค่าแทน (ง่ายกว่าและสะอาดกว่าฉันจะเถียง) คุณสามารถมี:
{
"Username": "User1",
"Data": [
{
"Id": "RandomGUID123",
"Order": {
"Item": "ItemName123",
"ItemCount": 40
},
"ShipmentNumber": "7657575"
},
{
"Id": "RandomGUID976",
"Order": {
"Item": "ItemName7686",
"ItemCount": 7
},
"ShipmentNumber": "876876"
}
]
}
ด้วยแบบสอบถามเช่น:
SELECT DISTINCT VALUE(c.Username)
FROM c
JOIN (SELECT VALUE d from d IN c.Data where d["Order"].ItemCount > 10)
ผลลัพธ์:
[
"User1"
]
"คำสั่งซื้อ" เป็นคำหลักที่สงวนไว้และต้องใช้ไวยากรณ์วงเล็บในการอ้างอิง
SteveZhao Aug 18 2020 at 02:20
ตามที่โนอาห์ตอบโมเดลกุญแจเป็นค่าเป็นวิธีที่จะบรรลุ
นอกจากนี้ยังมีอีกวิธีหนึ่งในการบรรลุผลโดยไม่ต้องเปลี่ยนสคีมาของเอกสารของคุณสร้าง UDF ดังนี้:
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;
}
จากนั้นเรียกใช้ sql นี้:
SELECT c.Username FROM c where udf.getResult(c.Data)
ผลลัพธ์:
[
{
"Username": "User1"
}
]