Interroger un objet imbriqué complexe dans cosmosdb à l'aide de SQL Api

Aug 17 2020

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

NoahStahl Aug 17 2020 at 23:10

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.

SteveZhao Aug 18 2020 at 02:20

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