MapReduce Views

  • how-to
    +
    You can use MapReduce views to create queryable indexes in Couchbase Data Platform.

    Although still maintained and supported for legacy use, Views date from the earliest days of Couchbase Server development, and as such are rarely the best choice over, say, our Query service if you are starting a fresh application. See our discussion document on the best service for you to use.

    Note, if you are provisioning Views on Couchbase Server for a legacy application, they must run on a couchstore bucket.

    The normal CRUD methods allow you to look up a document by its ID. A MapReduce (view query) allows you to lookup one or more documents based on various criteria. MapReduce views are comprised of a map function that is executed once per document (this is done incrementally, so this is not run each time you query the view) and an optional reduce function that performs aggregation on the results of the map function. The map and reduce functions are stored on the server and written in JavaScript.

    MapReduce queries can be further customized during query time to allow only a subset (or range) of the data to be returned.

    See the Incremental MapReduce Views and Querying Data with Views sections of the general documentation to learn more about views and their architecture.

    Querying Views

    Once you have a view defined, it can be queried from the Ruby SDK by using the view_query method on a Bucket instance.

    Here is an example:

    bucket = cluster.bucket("beer-sample")
    
    options = Bucket::ViewOptions.new
    options.limit = 5
    view_result = bucket.view_query("beer", "brewery_beers", options)
    view_result.rows.each do |row|
      puts "key: #{row.id}, id: #{row.id}"
    end
    #=>
    # key: 21st_amendment_brewery_cafe, id: 21st_amendment_brewery_cafe
    # key: 21st_amendment_brewery_cafe-21a_ipa, id: 21st_amendment_brewery_cafe-21a_ipa
    # key: 21st_amendment_brewery_cafe-563_stout, id: 21st_amendment_brewery_cafe-563_stout
    # key: 21st_amendment_brewery_cafe-amendment_pale_ale, id: 21st_amendment_brewery_cafe-amendment_pale_ale
    # key: 21st_amendment_brewery_cafe-bitter_american, id: 21st_amendment_brewery_cafe-bitter_american
    
    puts "Total rows: #{view_result.meta_data.total_rows}"
    #=> Total rows: 7303

    MetaData

    The meta_data returned with the results can be used to show the total number of results, and various debug info:

    options = Bucket::ViewOptions.new
    options.limit = 5
    options.debug = true
    view_result = bucket.view_query("beer", "brewery_beers", options)
    puts "Total rows: #{view_result.meta_data.total_rows}"
    #=> Total rows: 7303
    puts "Debug info present: #{view_result.meta_data.debug_info.is_a?(Hash)}"
    #=> Debug info present: true

    For more details, see the API reference.