Consultando objetos aninhados complexos em cosmosdb usando sql Api
Como consultar apenas os usuários cujo Itemcount> 10 do objeto aninhado complexo (com chave dinâmica) do comosdb usando sql api? UDF não preferido.
Algo como,
Selecione c.nomedeusuario de c onde c.Dados [*]. 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"
}
}
}
}
Respostas
Não tenho certeza sobre como lidar com chaves desconhecidas, mas se você estiver disposto a modelar a chave como um valor (mais simples e mais limpo, eu diria), você poderia:
{
"Username": "User1",
"Data": [
{
"Id": "RandomGUID123",
"Order": {
"Item": "ItemName123",
"ItemCount": 40
},
"ShipmentNumber": "7657575"
},
{
"Id": "RandomGUID976",
"Order": {
"Item": "ItemName7686",
"ItemCount": 7
},
"ShipmentNumber": "876876"
}
]
}
Com uma consulta como:
SELECT DISTINCT VALUE(c.Username)
FROM c
JOIN (SELECT VALUE d from d IN c.Data where d["Order"].ItemCount > 10)
Resultado:
[
"User1"
]
"Order" é uma palavra-chave reservada e requer a sintaxe de colchetes para fazer referência.
Conforme Noah responde, modele a chave como um valor é uma forma de alcançar.
Além disso, há outra maneira de conseguir, sem alterar o esquema do seu documento. Crie UDF assim:
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;
}
Em seguida, execute este sql:
SELECT c.Username FROM c where udf.getResult(c.Data)
Resultado:
[
{
"Username": "User1"
}
]