Consulta de objetos anidados complejos en cosmosdb usando sql Api
¿Cómo consultar solo a aquellos usuarios cuyo Itemcount> 10 del objeto anidado complejo (con clave dinámica) de comosdb usando sql api? No se prefiere UDF.
Algo como,
Seleccione c.username de c donde 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"
}
}
}
}
Respuestas
No estoy seguro de cómo manejar claves desconocidas, pero si está dispuesto a modelar la clave como un valor en su lugar (yo diría que es más simple y limpio), podría tener:
{
"Username": "User1",
"Data": [
{
"Id": "RandomGUID123",
"Order": {
"Item": "ItemName123",
"ItemCount": 40
},
"ShipmentNumber": "7657575"
},
{
"Id": "RandomGUID976",
"Order": {
"Item": "ItemName7686",
"ItemCount": 7
},
"ShipmentNumber": "876876"
}
]
}
Con una 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"
]
"Orden" es una palabra clave reservada y requiere la sintaxis de corchetes para hacer referencia.
Como responde Noah, modele la clave como un valor es una forma de lograrlo.
Además, hay otra forma de lograrlo sin cambiar el esquema de su documento. Cree UDF así:
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;
}
Luego ejecute este sql:
SELECT c.Username FROM c where udf.getResult(c.Data)
Resultado:
[
{
"Username": "User1"
}
]