Nested Operators and Expressions
- reference
In N1QL, nested operators and paths indicate expressions to access nested sub-documents within a JSON document or expression.
A nested expression may contain field selection operators, element selection operators, and array slicing operators.
field-expr | element-expr | slice-expr
These special operators are needed to access the data because Couchbase documents can have nested objects and embedded arrays. A field selection operator is used to refer to a field in an object, and an element selection operator is used to refer to an element in an array. You can use a combination of these operators to access nested data at any depth in a document.
Field Selection
Field selection operators use the dot notation . to refer to a child field, that is, a field one level down in a nested object.
The arguments identifier or escaped-identifier specify the name of the nested field.
The form [ name-expr ] is used to specify a nested field by evaluating the name expression contained in the brackets.
field-expression
expression . ( identifier | escaped identifier [ i ])
By default, field names are case sensitive.
To access a field case-insensitively, include the trailing i.
For example, if you have the following data:
{
"address": {
"city": "Mountain View"
},
"revisions": [2013, 2012, 2011, 2010]
}
The following expressions all evaluate to "Mountain View".
address.city, address.`CITY`i, address.["city"], and address.["CITY"]i
Element Selection
Element selection operators use the bracket notation [ ] to access an element inside a nested array.
The position argument specifies an element in the array.
Negative positions are counted backwards from the end of the array.
element-expression
expression [ expression ]
For example, given the following data:
{
"address": {
"city": "Mountain View"
},
"revisions": [2013, 2012, 2011, 2010]
}
In our example, the expression revisions[0] evaluates to 2013.
The expression revision[-1] evaluates to 2010.
Array Slicing
You can get subsets or segments of an array; this is called array slicing. Here is the syntax for array slicing:
source-array [ start_expr : [ end_expr ] ]
It returns a new a subset of the source array, containing the elements from position start-expr to end-expr minus 1.
The element at start-expr is included, while the element at end-expr is not.
The array index starts with 0.
If end-expr is omitted, all elements from start-expr to the end of the source array are included.
Negative positions are counted backwards from the end of the array.
For example, given the following data:
{
"address": {
"city": "Mountain View"
},
"revisions": [2013, 2012, 2011, 2010]
}
The expression revisions[1:3] evaluates to the array value [2012, 2011].
The expression revisions[1:] evaluates to the array value [2012, 2011, 2010].