DocumentDB SQL Query Cheat Sheet
Quick reference for writing Azure DocumentDB (Cosmos DB) queries. All examples use two sample Families documents — AndersenFamily (WA) and WakefieldFamily (NY).
Example JSON Documents
{
"id": "AndersenFamily",
"lastName": "Andersen",
"parents": [ { "firstName": "Thomas" }, { "firstName": "Mary Kay" } ],
"children": [
{
"firstName": "Henriette Thaulow",
"gender": "female",
"grade": 5,
"pets": [ { "givenName": "Fluffy" } ]
}
],
"address": { "state": "WA", "county": "King", "city": "seattle" },
"creationDate": "2015-01-03T12:00Z",
"isRegistered": true,
"location": { "type": "Point", "coordinates": [31.9, -4.8] }
}
{
"id": "WakefieldFamily",
"parents": [
{ "familyName": "Wakefield", "givenName": "Robin" },
{ "familyName": "Miller", "givenName": "Ben" }
],
"children": [
{
"familyName": "Merriam", "givenName": "Jesse",
"gender": "female", "grade": 1,
"pets": [ { "givenName": "Goofy" }, { "givenName": "Shadow" } ]
},
{ "familyName": "Miller", "givenName": "Lisa", "gender": "female", "grade": 8 }
],
"address": { "state": "NY", "county": "Manhattan", "city": "NY" },
"creationDate": "2015-07-20T12:00Z",
"isRegistered": false
}
SELECT
-- All fields
SELECT * FROM Families f WHERE f.id = "AndersenFamily"
-- Specific fields
SELECT f.id, f.address.city FROM Families f ORDER BY f.address.city
-- Projected object
SELECT {"Name": f.id, "City": f.address.city} AS Family
FROM Families f
WHERE f.address.city = f.address.state
-- TOP N rows
SELECT TOP 100 * FROM Families f
-- VALUE keyword (unwrap scalar)
SELECT VALUE "Hello World"
FROM and Array Indexing
-- Root collection
SELECT * FROM Families f WHERE f.lastName = "Andersen"
-- Array element by index
SELECT * FROM Families.children[0] c WHERE c.grade >= 5
WHERE
-- Equality
SELECT * FROM Families f WHERE f.id = "AndersenFamily"
-- Compound condition
SELECT * FROM Families.children[0] c
WHERE c.grade >= 5 AND c.isRegistered = true
-- IN keyword
SELECT * FROM Families
WHERE Families.address.state IN ("NY", "WA", "CA", "PA", "OH", "OR", "MI", "WI")
-- BETWEEN keyword
SELECT * FROM Families.children[0] c WHERE c.grade BETWEEN 1 AND 5
ORDER BY
SELECT f.id, f.address.city
FROM Families f
ORDER BY f.address.city ASC
JOIN (Intra-Document)
DocumentDB JOIN is an intra-document self-join — it does not join across documents.
-- Flatten children array
SELECT c.givenName
FROM Families f
JOIN c IN f.children
WHERE f.id = 'WakefieldFamily'
ORDER BY f.address.city ASC
-- Multi-level join (children → pets)
SELECT
f.id AS familyName,
c.givenName AS childGivenName,
c.firstName AS childFirstName,
p.givenName AS petName
FROM Families f
JOIN c IN f.children
JOIN p IN c.pets
Parameterized SQL
SELECT *
FROM Families f
WHERE f.lastName = @lastName
AND f.address.state = @addressState
Object and Array Creation
-- Array literal
SELECT [f.address.city, f.address.state] AS CityState FROM Families f
-- Object literal
SELECT {"Name": f.id, "City": f.address.city} AS Family FROM Families f
Escape / Quoted Accessor
SELECT f["lastName"] FROM Families f WHERE f["id"] = "AndersenFamily"
Operators
Arithmetic
SELECT VALUE (2 + 3 * 4) -- +, -, *, /, %
Comparison
| Operator | Meaning |
|---|---|
= | Equal |
!= / <> | Not equal |
>, >= | Greater than / or equal |
<, <= | Less than / or equal |
?? | Coalesce |
Logical
-- AND, OR, NOT
SELECT * FROM Families.children[0] c
WHERE c.grade >= 5 AND c.isRegistered = true
Bitwise
|, &, ^, <<, >>, >>> (zero-fill right shift)
String Concatenation
SELECT VALUE ("Hello" || " " || "World")
Ternary ? and Coalesce ??
SELECT (c.grade < 5) ? "elementary" : ((c.grade < 9) ? "junior" : "high") AS gradeLevel
FROM Families.children[0] c
JavaScript UDF
-- Register UDF (JavaScript)
-- function REGEX_MATCH(input, pattern) { return input.match(pattern) !== null; }
-- Use in query
SELECT udf.REGEX_MATCH(Families.address.city, ".*eattle")
Built-in Functions
Mathematical
SELECT VALUE ABS(-4)
-- ABS, CEILING, EXP, FLOOR, LOG, LOG10, POWER, ROUND, SIGN, SQRT, SQUARE, TRUNC
-- ACOS, ASIN, ATAN, ATN2, COS, COT, DEGREES, PI, RADIANS, SIN, TAN
Type Checking
SELECT IS_DEFINED(f.lastName), IS_NUMBER(4) FROM Families f
-- IS_ARRAY, IS_BOOL, IS_NULL, IS_NUMBER, IS_OBJECT, IS_STRING, IS_DEFINED, IS_PRIMITIVE
String
SELECT Families.id, Families.address.city
FROM Families
WHERE STARTSWITH(Families.id, "Wakefield")
-- CONCAT, CONTAINS, ENDSWITH, INDEX_OF, LEFT, LENGTH, LOWER, LTRIM,
-- REPLACE, REPLICATE, REVERSE, RIGHT, RTRIM, STARTSWITH, SUBSTRING, UPPER
Array
SELECT Families.id
FROM Families
WHERE ARRAY_CONTAINS(Families.parents, { givenName: "Robin", familyName: "Wakefield" })
-- ARRAY_CONCAT, ARRAY_CONTAINS, ARRAY_LENGTH, ARRAY_SLICE
Geospatial
SELECT * FROM Families f
WHERE ST_Distance(f.location, {"type": "Point", "coordinates": [31.9, -4.8]}) < 30000
-- ST_WITHIN, ST_DISTANCE, ST_INTERSECTS, ST_ISVALID, ST_ISVALIDDETAILED
Query Interfaces
| Interface | Details |
|---|---|
| Server-side | SQL, JavaScript integrated query |
| Client-side | .NET (LINQ), Java, JavaScript, Node.js, Python |
| Online playground | https://www.documentdb.com/sql/demo |