SQL API를 사용하여 cosmosdb에서 복잡한 중첩 개체 쿼리
SQL API를 사용하여 comosdb의 복잡한 중첩 개체 (동적 키 포함)에서 Itemcount> 10 인 사용자 만 쿼리하는 방법은 무엇입니까? UDF는 선호되지 않습니다.
같은 것,
c에서 c.username을 선택합니다. 여기서 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"
}
}
}
}
답변
NoahStahl
알 수없는 키를 처리하는 방법에 대해서는 잘 모르겠지만 키를 값으로 모델링하려는 경우 (더 간단하고 깔끔하다고 주장합니다) 다음과 같이 할 수 있습니다.
{
"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"
]
"Order"는 예약 된 키워드이며 참조하려면 대괄호 구문이 필요합니다.
SteveZhao
노아가 대답했듯이 키를 가치로 모델링하는 것이 달성하는 방법입니다.
또한 문서의 스키마를 변경하지 않고 달성 할 수있는 또 다른 방법이 있습니다. 다음과 같이 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"
}
]