SQL API를 사용하여 cosmosdb에서 복잡한 중첩 개체 쿼리

Aug 17 2020

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 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"
]

"Order"는 예약 된 키워드이며 참조하려면 대괄호 구문이 필요합니다.

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"
    }
]