Cloudant blog Home Search

Cloudant Fundamentals 7/10

In previous posts we’ve looked add adding and retrieving documents from a Cloudant database by their key fields - the _id field. There’s a good chance that you want your database to be able to do more than that which is where querying comes in.

Making a query🔗


A Cloudant Query allows questions to be asked of your Cloudant data, questions such as:

  • get me all the documents where the dob field is less than 1970-01-01
  • get me all the documents where the dob field is less than 1970-01-01 and the actor field is Marlon Brando
  • get the first fifty films staring Matthew Broderick in date order
  • get the next 50 films matching the previous query

Queries are expressed as JSON documents such as:

{
  "selector": {
    "dob": {
      "$lt": "1970-01-01"
    }
  }
}

The selector object is the equivalent of the “WHERE” part of relational database query. It defines the values or ranges of fields that you are looking for - in this case, the $lt (“less than”) operator is used to perform our first query (other operators are available)

To perform the query we simply POST the JSON to the /db/_find endpoint:

$ curl -X POST \
    -H'Content-type:application/json' \
    -d@query.json \
    "$URL/newdb/_find"

The returned data will have the following form:

{
  "docs":[ ],
  "bookmark": "",
  "warning": "no matching index found, create an index to optimize query time"
}
  • docs is an array of matching documents
  • bookmark unlocks access to the next page of matches
  • warning is cautioning us that we are performing a query which foreces Cloudant to scan the whole database to answer. We can improve performance with an index, a feature we’ll meet later.

More complex clauses🔗


Our second query needs to use the $and operator which is fed an array of clauses. The first clause is the same as our first query and we add on a second clause to match by actor name.

{
  "selector": {
    "$and": [
      {
        "dob": {
          "$lt": "1970-01-01"
        }
      },
      {
        "actor": "Marlon Brando"
      }
    ]
  }
}

Only documents matching all of the $and clauses will make it to the result set.

Sorting🔗


The third query adds a sort attribute to the query object:

{
  "selector": {
    "actor": "Matthew Broderick"
  }
  "sort": {
    "date": "asc"
  }
}

We can sort by one or more fields in ascending (asc) or descending (desc) order.

Next time🔗


In the next post we’ll do all this again, but programmatically in Node.js and introduce the prospect of expressing our queries in SQL.

Syndicated from: https://medium.com/ibm-watson-data-lab/cloudant-fundamentals-querying-82fdcaea1677