Query JSON columns in elastic tables
[This topic is pre-release documentation and is subject to change.]
Elastic tables support the JavaScript Object Notation (JSON) format for text columns. These columns can be used to store schema-less arbitrary JSON according to application needs. You can use the ExecuteCosmosSQLQuery
message to run any Cosmos SQL query directly against your elastic table and filter rows based on properties inside JSON.
For an example that shows how to create a JSON column, see Create a column with JSON format.
Set JSON column data
This example creates a row in the contoso_SensorData
elastic table that has JSON data in the contoso_EnergyConsumption
column.
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;
}
Query JSON column data
This example runs a query on the contoso_SensorData
elastic table to filter for all rows where the energyconsumption.power
value is more than 5.
All table columns can be queried by using a c.props
prefix on the schema name of the columns. In this prefix, c
is an alias or shorthand notation for the elastic table that is being queried. For example, the contoso_deviceid
column in the contoso_sensordata
table can be referenced in the Cosmos SQL query by using c.props.contoso_deviceid
.
Learn about queries in Azure Cosmos DB for NoSQL.
The SDK for .NET doesn't yet have request and response classes for the ExecuteCosmosSqlQuery
message. You can use the OrganizationRequest class and the OrganizationResponse class.
The ExecuteCosmosSqlQuery
message has the following input parameters.
Name | Type | Description |
---|---|---|
QueryText |
String | (Required) The Cosmos SQL query. |
EntityLogicalName |
String | (Required) The logical name of the table. |
QueryParameters |
ParameterCollection | (Optional) Values for any parameters that are specified in the QueryText parameter. |
PageSize |
Long | (Optional) The number of records to return on a single page. |
PagingCookie |
String | (Optional) The paging cookie to use. |
PartitionId |
String | (Optional) The Partitionid value to set the scope of the query. |
ExecuteCosmosSqlQuery
returns an Entity that is an open type. This entity has the following attributes.
Name | Type | Description |
---|---|---|
PagingCookie |
String | A value to set for subsequent requests when there are more results. |
HasMore |
Bool | A value that indicates whether there are more records in the results. |
Result |
String | JSON with values for the results. |
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;}
}
Next steps
See also
Elastic tables for developers
Create elastic tables using code
Use elastic tables using code
Bulk operation messages
Elastic table sample code