Data Query Language

To aid with the intgration of most Data Stores a common query language must exist and must be defined. To keep with the ability to store queries as JSON a structure is borrowed from that of Sift and MongoDB. All operations listed below must be implmented for a data store to be considered acceptable. In some cases, such as the memory store or the LevelDB store, sift may be directly utilized to traverse and filter the results before returning them to the caller.

The following was taken from the Sift documentation and reduced to fit the larger audience.

$in

array value must be $in the given query:

Intersecting two arrays:

  //filtered: ['Brazil']
  filter({ $in: ['Costa Rica','Brazil'] }, ['Brazil','Haiti','Peru','Chile']);

Here's another example. This acts more like the $or operator:

  filter({ location: { $in: ['Costa Rica','Brazil'] } }, { name: 'Craig', location: 'Brazil' });

$nin

Opposite of $in:

  //filtered: ['Haiti','Peru','Chile']
  filter({ $nin: ['Costa Rica','Brazil'] }, ['Brazil','Haiti','Peru','Chile']);

$exists

Checks if whether a value exists:

  //filtered: ['Craig','Tim']
  filter({ $exists: true }, ['Craig',null,'Tim']);

You can also filter out values that don't exist

  //filtered: [{ name: 'Craig', city: 'Minneapolis' }]
  filter({ city: { $exists: false } }, [ { name: 'Craig', city: 'Minneapolis' }, { name: 'Tim' }]);

$gte

Checks if a number is >= value:

  //filtered: [2, 3]
  filter({ $gte: 2 }, [0, 1, 2, 3]);

$gt

Checks if a number is > value:

  //filtered: [3]
  filter({ $gt: 2 }, [0, 1, 2, 3]);

$lte

Checks if a number is <= value.

  //filtered: [0, 1, 2]
  filter({ $lte: 2 }, [0, 1, 2, 3]);

$lt

Checks if number is < value.

  //filtered: [0, 1]
  filter({ $lt: 2 }, [0, 1, 2, 3]);

$eq

Checks if query == value. Note that $eq can be omitted. For $eq, and $neq

  //filtered: [{ state: 'MN' }]
  filter({ state: {$eq: 'MN' }}, [{ state: 'MN' }, { state: 'CA' }, { state: 'WI' });

Or:

  //filtered: [{ state: 'MN' }]
  filter({ state: 'MN' }, [{ state: 'MN' }, { state: 'CA' }, { state: 'WI' });

$ne

Checks if query != value.

  //filtered: [{ state: 'CA' }, { state: 'WI'}]
  filter({ state: {$ne: 'MN' }}, [{ state: 'MN' }, { state: 'CA' }, { state: 'WI' });

$all

values must match everything in array:

  //filtered: [ { tags: ['books','programming','travel' ]} ]
  filter({ tags: {$all: ['books','programming'] }}, [
  { tags: ['books','programming','travel' ] },
  { tags: ['travel','cooking'] } ]);

$and

ability to use an array of expressions. All expressions must test true.

  //filtered: [ { name: 'Craig', state: 'MN' }]
  filter({ $and: [ { name: 'Craig' }, { state: 'MN' } ] }, [
  { name: 'Craig', state: 'MN' },
  { name: 'Tim', state: 'MN' },
  { name: 'Joe', state: 'CA' } ]);

$or

OR array of expressions.

  //filtered: [ { name: 'Craig', state: 'MN' }, { name: 'Tim', state: 'MN' }]
  filter({ $or: [ { name: 'Craig' }, { state: 'MN' } ] }, [
  { name: 'Craig', state: 'MN' },
  { name: 'Tim', state: 'MN' },
  { name: 'Joe', state: 'CA' } ]);

$nor

opposite of or:

  //filtered: [ { name: 'Tim', state: 'MN' }, { name: 'Joe', state: 'CA' }]
  filter({ $nor: [ { name: 'Craig' }, { state: 'MN' } ] }, [
  { name: 'Craig', state: 'MN' },
  { name: 'Tim', state: 'MN' },
  { name: 'Joe', state: 'CA' } ]);

$regex

Matches values based on the given regular expression

  filter({ $regex: /^f/i, $nin: ["frank"] }, ["frank", "fred", "sam", "frost"]); // ["fred", "frost"]

$not

Not expression:

  filter({$not:{$in:['craig','tim']}}, ['craig','tim','jake']); //['jake']
  filter({$not:{$size:5}}, ['craig','tim','jake']); //['tim','jake']