Partage via


Interroger les colonnes JSON dans les tables élastiques

[Cette rubrique fait partie de la documentation en version préliminaire et peut faire l'objet de modifications.]

Les tables élastiques prennent en charge le format JavaScript Object Notation (JSON) pour les colonnes de texte. Ces colonnes peuvent être utilisées pour stocker du JSON arbitraire sans schéma en fonction des besoins de l’application. Vous pouvez utiliser le message ExecuteCosmosSQLQuery pour exécuter n’importe quelle requête Cosmos SQL directement sur votre table élastique et filtrer les lignes en fonction des propriétés dans JSON.

Pour un exemple montrant comment créer une colonne JSON, voir Créer une colonne au format JSON

Définir les données de la colonne JSON

Cet exemple crée une ligne dans la table élastique contoso_SensorData comportant des données JSON dans la colonne contoso_EnergyConsumption.

public static Guid CreateWithJsonData(
    IOrganizationService service, 
    string deviceId, 
    ref string sessionToken)
{
    var entity = new Entity("contoso_sensordata")
    {
        Attributes =
        {
            { "contoso_deviceid", deviceId },
            { "contoso_sensortype", "Humidity" },
            { "contoso_value", 40 },
            { "contoso_energyconsumption", "{ \"power\": 0.55, \"powerUnit\":\"kWh\", \"voltage\": 2, \"voltageUnit\": \"kV\" }",
            { "contoso_timestamp", DateTime.UtcNow},
            { "partitionid", deviceId },
            { "ttlinseconds", 86400  }  // 86400  seconds in a day
        }
    };

    var request = new CreateRequest
    {
        Target = entity
    };

    var response = (CreateResponse)service.Execute(request);

    // Capture the session token
    sessionToken = response.Results["x-ms-session-token"].ToString();

    return response.id;
}

Interroger les données de la colonne JSON

Cet exemple exécute une requête sur la table élastique contoso_SensorData pour filtrer toutes les lignes où la valeur energyconsumption.power est supérieure à 5.

Toutes les colonnes de la table peuvent être interrogées à l’aide d’un préfixe c.props sur le nom de schéma des colonnes. Dans ce préfixe, c est un alias ou une notation abrégée pour la table élastique interrogée. Par exemple, la colonne contoso_deviceid de la table contoso_sensordata peut être référencée dans la requête Cosmos SQL à l’aide c.props.contoso_deviceid.

En savoir plus sur les requêtes dans Azure Cosmos DB pour NoSQL.

Le SDK pour .NET n’a pas encore de classes de requête et de réponse pour le message ExecuteCosmosSqlQuery. Vous pouvez utiliser la classe OrganizationRequestOrganizationRequest et la classe OrganizationResponseOrganizationResponse.

Le message ExecuteCosmosSqlQuery a les paramètres d’entrée suivants :

Nom  Type Description
QueryText String (Obligatoire) La requête SQL Cosmos.
EntityLogicalName String (Obligatoire) Nom logique de la table.
QueryParameters ParameterCollection (Facultatif) Valeurs de tous les paramètres spécifiés dans le paramètre QueryText.
PageSize Long (Facultatif) Le nombre d’enregistrements renvoyés avec une page unique.
PagingCookie String (Facultatif) Le cookie de pagination à utiliser.
PartitionId String (Facultatif) La valeur Partitionid pour définir l’étendue de la requête.

ExecuteCosmosSqlQuery renvoie une Entité de type ouvert. Cette entité contient les attributs suivants :

Nom  Type Description
PagingCookie String Une valeur à définir pour les requêtes suivantes lorsqu’il y a plus de résultats.
HasMore Bool Une valeur qui indique s’il y a plus d’enregistrements dans les résultats.
Result String JSON avec des valeurs pour les résultats.
public static List<QueryResult> QueryJsonAttribute(IOrganizationService service)
{
    StringBuilder query = new();
    query.Append("select c.props.contoso_deviceid as deviceId, ");
    query.Append("c.props.contoso_timestamp as timestamp, ");
    query.Append("c.props.contoso_energyconsumption.power as power ");
    query.Append("from c where c.props.contoso_sensortype='Humidity' ");
    query.Append("and c.props.contoso_energyconsumption.power > 5");

    var request = new OrganizationRequest("ExecuteCosmosSqlQuery")
    {
        Parameters = {
            { "EntityLogicalName","contoso_sensordata" },
            { "QueryText", query.ToString() }
        }
    };

    OrganizationResponse response = service.Execute(request);

    // Deserialized query result into a class with expected schema.
    Entity result = (Entity)response.Results["Result"];
    return JsonConvert.DeserializeObject<List<QueryResult>>(result["Result"].ToString());
}

public class QueryResult
{
    [JsonProperty("deviceId")]
    public string DeviceId {get;set;}
    [JsonProperty("timestamp")]
    public DateTime Timestamp {get;set;}
    [JsonProperty("power")]
    public int Power {get;set;}
}

Étapes suivantes

Voir aussi

Tables élastiques pour les développeurs
Créer des tables élastiques à l’aide de code
Utiliser des tables élastiques à l’aide de code
Messages d’opération en bloc
Exemple de code de table élastique