Backend update Jun 171st 2018

New GROQ Features


  • GROQ: Added the select() function and => pair operator for conditional evaluation, e.g. select(value == "string" => "match", "default") yielding "match" if value == "string", otherwise "default".
  • GROQ: Added the ... splat operator which pulls array and object members into the current scope, e.g. [...[1,2], 3, ...[4,5]] yielding [1,2,3,4,5], and similarly {...{"a":1,"b":2}, "c":3, ...{"d":4,"e":5}} yielding {"a":1,"b":2,"c":3,"d":4,"e":5}.
  • GROQ: Added syntactic sugar for conditionals in projections, where the projection *{_id, value == "string" => {"foo": "bar"}} yields {_id, "foo": "bar"} if value == "string" evaluates to true. This is exactly equivalent to *{_id, == "string" => {"foo": "bar"}}.
  • GROQ: match can now use * wildcards anywhere in the search term, not only at the end, e.g. *[ value match "a*c" ].


  • Fixed an issue where indexing of arrays containing both references and other content would not index all content properly, leading to missing filter results. We will transparently reindex existing content in the near future, but as a workaround documents can be reindexed manually by making a small change.
  • Fixed an issue where large listener events (beyond 64 kB) could be delayed by up to 10 seconds.

Other Improvements

  • GROQ: Improved performance of conjunctions (&& terms), which in particular improved performance significantly for anonymous users.
  • GROQ: count() no longer gives error on null arguments.