Interroger un objet imbriqué complexe dans cosmosdb à l'aide de SQL Api
Comment interroger uniquement les utilisateurs dont le nombre d'éléments> 10 à partir de l'objet imbriqué complexe (avec clé dynamique) de comosdb à l'aide de l'API SQL? UDF n'est pas préféré.
Quelque chose comme,
Sélectionnez c.username dans c où 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"
}
}
}
}
Réponses
Je ne sais pas comment gérer les clés inconnues, mais si vous êtes prêt à modéliser la clé comme une valeur à la place (plus simple et plus propre, je dirais), vous pourriez avoir:
{
"Username": "User1",
"Data": [
{
"Id": "RandomGUID123",
"Order": {
"Item": "ItemName123",
"ItemCount": 40
},
"ShipmentNumber": "7657575"
},
{
"Id": "RandomGUID976",
"Order": {
"Item": "ItemName7686",
"ItemCount": 7
},
"ShipmentNumber": "876876"
}
]
}
Avec une requête comme:
SELECT DISTINCT VALUE(c.Username)
FROM c
JOIN (SELECT VALUE d from d IN c.Data where d["Order"].ItemCount > 10)
Résultat:
[
"User1"
]
«Order» est un mot-clé réservé et nécessite la syntaxe entre crochets pour référence.
Comme Noah répond, modéliser la clé comme une valeur est un moyen d'atteindre.
De plus, il existe un autre moyen d'y parvenir sans changer le schéma de votre document. Créez un UDF comme ceci:
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;
}
Puis exécutez ce sql:
SELECT c.Username FROM c where udf.getResult(c.Data)
Résultat:
[
{
"Username": "User1"
}
]