diff --git a/CHANGELOG b/CHANGELOG index bd47cb49eb..d6e4f8dfdd 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -21,9 +21,15 @@ v2.8.0 (XXXX-XX-XX) tags array using the following AQL query: FOR doc IN colName - FILTER "ArangoDB" IN doc.tags + FILTER "ArangoDB" IN doc.tags[*] RETURN doc +* rewrote AQL query optimizer rule `use-index-range` and renamed it to `use-indexes`. + The name change affects rule names in the optimizer's output. + +* rewrote AQL execution node `IndexRangeNode` and renamed it to `IndexNode`. The name + change affects node names in the optimizer's explain output. + * added convenience function `db._explain(query)` for human-readable explanation of AQL queries diff --git a/Documentation/Books/Users/IndexHandling/WhichIndex.mdpp b/Documentation/Books/Users/IndexHandling/WhichIndex.mdpp index 3726f88a01..1d8803519c 100644 --- a/Documentation/Books/Users/IndexHandling/WhichIndex.mdpp +++ b/Documentation/Books/Users/IndexHandling/WhichIndex.mdpp @@ -132,3 +132,49 @@ Note that if you intend to use [joins](../AqlExamples/Join.html) it may be cleve to use non-sparsity and maybe even uniqueness for that attribute, else all items containing the `null` value will match against each other and thus produce large results. + +!SUBSECTION Indexing array values + +If an index attribute contains an array, ArangoDB will store the entire array as the index value +by default. Accessing individual members of the array via the index is not possible this +way. + +To make an index insert the individual array members into the index separately, an array index +needs to be created for the attribute. Array indexes can be set up like regular hash or +skiplist indexes using the `collection.ensureIndex()` function. To make a hash or skiplist index +an array index, the index attribute name needs to be extended with [\*]. + +The following example creates an array hash index on the `tags` attribute in a collection named +`posts`: + +```js +db.posts.ensureIndex({ type: "hash", fields: [ "tags[*]" ] }); +``` + +This array index can then be used for looking up individual `tags` values from AQL queries via +the `IN` operator and the attribute name extension [\*]: + + FOR doc IN posts + FILTER 'foobar' IN doc.tags[*] + RETURN doc + +The following FILTER conditions will not use the array index: + + FILTER 'foobar' IN doc.tags + FILTER doc.tags IN 'foobar' + FILTER doc.tags == 'foobar' + FILTER 'foobar' == doc.tags + +Array values will automatically be de-duplicated before being inserted into an array index. +For example, if the following document is inserted into the collection, the duplicate array +value `bar` will be inserted only once: + +```js +db.posts.insert({ tags: [ "foobar", "bar", "bar" ] }); +``` + +If an array index is declared unique, the de-duplication of array values will happen before +inserting the values into the index, so the above insert operation will not necessarily fail. +It will fail if the index already contains an instance of the `bar` value, but will succeed +if the value `bar` is not already present in the index. +