Compartir a través de


Consultar columnas JSON en tablas elásticas

[Este tema es documentación preliminar y está sujeto a modificaciones.]

Las tablas elásticas admiten el formato de notación de objetos JavaScript (JSON) para columnas de texto. Estas columnas se puede usar para almacenar JSON arbitrario sin esquema según las necesidades de la aplicación. Puedes usar el mensaje ExecuteCosmosSQLQuery para ejecutar cualquier consulta de Cosmos SQL directamente en su tabla elástica y filtrar filas según las propiedades dentro de JSON.

Para ver un ejemplo que muestra cómo crear una columna JSON, consulte Crear una columna con formato JSON.

Establecer datos de columna JSON

Este ejemplo crea una fila en la tabla elástica contoso_SensorData con datos JSON en la columna 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;
}

Consultar datos de columna JSON

Este ejemplo ejecuta una consulta en la tabla elástica contoso_SensorData para filtrar todas las filas donde el valor de energyconsumption.power es mayor a 5.

Todas las columnas de la tabla se pueden consultar mediante un prefijo c.props en el nombre de esquema de las columnas. En este prefijo, c es un alias o una notación abreviada para la tabla elástica que se está consultando. Por ejemplo, la columna contoso_deviceid en la tabla contoso_sensordata se puede hacer referencia a la tabla en la consulta de Cosmos SQL usando c.props.contoso_deviceid.

Más información sobre las consultas en Azure Cosmos DB para NoSQL.

El SDK para .NET aún no tiene clases de solicitud y respuesta para el mensaje ExecuteCosmosSqlQuery. Puedes usar la Clase OrganizationRequest y la Clase OrganizationResponseOrganizationResponse class.

El mensaje ExecuteCosmosSqlQuery tiene los siguientes parámetros de entrada.

Name Type Descripción
QueryText String (Obligatorio) la consulta Cosmos SQL.
EntityLogicalName String (Obligatorio) Nombre lógico de la tabla.
QueryParameters ParameterCollection (Opcional) Valores para cualquier parámetro que se especifique en el parámetro QueryText.
PageSize Largo (Opcional) El número de registros devueltos en una sola página.
PagingCookie String (Opcional) La cookie de paginación que se utilizará.
PartitionId String (Opcional) El valor Partitionid para establecer el alcance de la consulta.

ExecuteCosmosSqlQuery devuelve una Entidad que es de tipo abierto. La entidad tiene los siguientes atributos.

Name Type Descripción
PagingCookie String Un valor para establecer para solicitudes posteriores cuando haya más resultados.
HasMore Booleano Un valor que indica si hay más registros en los resultados.
Result String JSON con valores para los resultados.
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;}
}

Pasos siguientes

Consulte también

Tablas elásticas para desarrolladores
Crear tablas elásticas mediante código
Usar tablas elásticas mediante código
Mensajes de operación masiva
Código de ejemplo de tablas elásticas