sqlApiを使用したcosmosdb内の複雑なネストされたオブジェクトのクエリ
Aug 17 2020
sql apiを使用して、comosdbの複雑なネストされたオブジェクト(動的キーを使用)からItemcount> 10のユーザーのみをクエリするにはどうすればよいですか?UDFは好ましくありません。
何かのようなもの、
c.Data [*]。Order.ItemCount> 10であるcからc.usernameを選択します。
{
{
"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"
}
]