Abfrage von JSON-Spalten in elastischen Tabellen

[Dieses Thema ist Teil der Dokumentation zur Vorabversion und kann geändert werden.]

Elastische Tabellen unterstützen das JavaScript Object Notation (JSON)-Format für Textspalten. Diese Spalten können verwendet werden, um schemafreie, beliebige JSON-Daten gemäß den Bedürfnissen der Anwendung zu speichern. Mit der Nachricht ExecuteCosmosSQLQuery können Sie jede beliebige Cosmos SQL-Abfrage direkt gegen Ihre elastische Tabelle ausführen und Zeilen auf der Grundlage von Eigenschaften innerhalb von JSON filtern.

Ein Beispiel für das Erstellen einer JSON-Spalte finden Sie unter Erstellen einer Spalte im JSON-Format.

JSON-Spaltendaten festlegen

Dieses Beispiel erstellt eine Zeile in der elastischen Tabelle contoso_SensorData, die JSON-Daten in der Spalte contoso_EnergyConsumption enthält.

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;
}

Abfragen von JSON-Spalten-Daten

In diesem Beispiel wird eine Abfrage in der elastischen Tabelle contoso_SensorData zum Filtern nach allen Zeilen ausgeführt, in denen der energyconsumption.power-Wert mehr als 5 ist.

Alle Tabellenspalten können mit einem c.props-Präfix für den Schemanamen der Spalten abgefragt werden. In diesem Präfix ist c ein Alias ​​oder eine Kurzschreibweise für die elastische Tabelle, die abgefragt wird. Zum Beispiel kann die Spalte contoso_deviceid in der Tabelle contoso_sensordata in der Cosmos SQL-Abfrage mithilfe von c.props.contoso_deviceid referenziert werden.

Erfahren Sie mehr über Abfragen in Azure Cosmos DB für NoSQL.

Das SDK für .NET verfügt noch nicht über Anforderungs- und Antwortklassen für die Nachricht ExecuteCosmosSqlQuery. Sie können die OrganizationRequest-Klasse und die OrganizationResponse-Klasse verwenden.

Die ExecuteCosmosSqlQuery-Nachricht hat die folgenden Eingabeparameter.

Name des Dataflows Type Beschreibung
QueryText String (Erforderlich) Die Cosmos SQL-Abfrage.
EntityLogicalName String (Erforderlich) Der logische Name der Tabelle.
QueryParameters ParameterCollection (Optional) Werte für alle Parameter, die im Parameter QueryText angegeben sind.
PageSize Lang (Optional) Die Anzahl der Datensätze, die auf einer einzelnen Seite zurückgegeben werden.
PagingCookie String (Optional) Der zu verwendende Paging-Cookie.
PartitionId String (Optional) Der Partitionid-Wert, um den Bereich der Abfrage festzulegen.

ExecuteCosmosSqlQuery gibt eine Entität zurück, die ein offener Typ ist. Diese Entität hat die folgenden Attribute.

Name des Dataflows Type Beschreibung
PagingCookie String Ein Wert, der für nachfolgende Requests festgelegt wird, wenn es mehr Ergebnisse gibt.
HasMore Bool Ein Wert, der angibt, ob die Ergebnisse weitere Datensätze enthalten.
Result String JSON mit Werten für die Ergebnisse.
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;}
}

Nächste Schritte,

Siehe auch

Elastische Tabellen für Entwickler
Erstellen Sie elastische Tabellen mit Code
Elastische Tabellen mit Code verwenden
Massenvorgang für Nachrichten
Beispielcode für elastische Tabellen