1.5.4. /db/_design/design-doc/_view/view-name

    Executes the specified view function from the specified design document.

    Request:

    Response:

    1. HTTP/1.1 200 OK
    2. Cache-Control: must-revalidate
    3. Content-Type: application/json
    4. Date: Wed, 21 Aug 2013 09:12:06 GMT
    5. ETag: "2FOLSBSW4O6WB798XU4AQYA9B"
    6. Server: CouchDB (Erlang/OTP)
    7. Transfer-Encoding: chunked
    8. {
    9. "offset": 0,
    10. "rows": [
    11. {
    12. "id": "SpaghettiWithMeatballs",
    13. "key": "meatballs",
    14. "value": 1
    15. },
    16. {
    17. "id": "SpaghettiWithMeatballs",
    18. "key": "spaghetti",
    19. "value": 1
    20. },
    21. {
    22. "id": "SpaghettiWithMeatballs",
    23. "key": "tomato sauce",
    24. "value": 1
    25. }
    26. ],
    27. "total_rows": 3
    28. }

    Changed in version 1.6.0: added attachments and att_encoding_info parameters

    Changed in version 2.0.0: added sorted parameter

    Changed in version 2.1.0: added stable and update parameters

    POST /{db}/_design/{ddoc}/_view/{view}

    Executes the specified view function from the specified design document. POST view functionality supports identical parameters and behavior as specified in the API but allows for the query string parameters to be supplied as keys in a JSON object in the body of the POST request.

    Request:

    1. POST /recipes/_design/ingredients/_view/by_name HTTP/1.1
    2. Accept: application/json
    3. Content-Length: 37
    4. Host: localhost:5984
    5. {
    6. "keys": [
    7. "meatballs",
    8. "spaghetti"
    9. ]
    10. }

    Response:

    1. HTTP/1.1 200 OK
    2. Cache-Control: must-revalidate
    3. Content-Type: application/json
    4. Date: Wed, 21 Aug 2013 09:14:13 GMT
    5. ETag: "6R5NM8E872JIJF796VF7WI3FZ"
    6. Server: CouchDB (Erlang/OTP)
    7. Transfer-Encoding: chunked
    8. {
    9. "offset": 0,
    10. "rows": [
    11. {
    12. "id": "SpaghettiWithMeatballs",
    13. "key": "meatballs",
    14. "value": 1
    15. },
    16. {
    17. "id": "SpaghettiWithMeatballs",
    18. "key": "spaghetti",
    19. "value": 1
    20. }
    21. ],
    22. "total_rows": 3
    23. }

    There are two view indexing options that can be defined in a design document as boolean properties of an options object. Unlike the others querying options, these aren’t URL parameters because they take effect when the view index is generated, not when it’s accessed:

    • local_seq (boolean): Makes documents’ local sequence numbers available to map functions (as a _local_seq document property)
    • include_design (boolean): Allows map functions to be called on design documents as well as regular documents

    The definition of a view within a design document also creates an index based on the key information defined within each view. The production and use of the index significantly increases the speed of access and searching or selecting documents from the view.

    However, the index is not updated when new documents are added or modified in the database. Instead, the index is generated or updated, either when the view is first accessed, or when the view is accessed after a document has been updated. In each case, the index is updated before the view query is executed against the database.

    View indexes are updated incrementally in the following situations:

    • A new document has been added to the database.
    • A document has been deleted from the database.
    • A document in the database has been updated.

    Because the view is updated when it has been queried, it can result in a delay in returned information when the view is accessed, especially if there are a large number of documents in the database and the view index does not exist. There are a number of ways to mitigate, but not completely eliminate, these issues. These include:

    • Create the view definition (and associated design documents) on your database before allowing insertion or updates to the documents. If this is allowed while the view is being accessed, the index can be updated incrementally.
    • Manually force a view request from the database. You can do this either before users are allowed to use the view, or you can access the view manually after documents are added or updated.
    • Use the changes feed to monitor for changes to the database and then access the view to force the corresponding view index to be updated.

    None of these can completely eliminate the need for the indexes to be rebuilt or updated when the view is accessed, but they may lessen the effects on end-users of the index update affecting the user experience.

    Another alternative is to allow users to access a ‘stale’ version of the view index, rather than forcing the index to be updated and displaying the updated results. Using a stale view may not return the latest information, but will return the results of the view query using an existing version of the index.

    For example, to access the existing stale view by_recipe in the recipes design document:

    1. http://localhost:5984/recipes/_design/recipes/_view/by_recipe?stale=ok

    Accessing a stale view:

    • Does not trigger a rebuild of the view indexes, even if there have been changes since the last access.
    • Returns the current version of the view index, if a current version exists.
    • Returns an empty result set if the given view index does not exist.

    As an alternative, you use the update_after value to the stale parameter. This causes the view to be returned as a stale view, but for the update process to be triggered after the view information has been returned to the client.

    In addition to using stale views, you can also make use of the update_seq query argument. Using this query argument generates the view information including the update sequence of the database from which the view was generated. The returned value can be compared this to the current update sequence exposed in the database information (returned by ).

    Each element within the returned array is sorted using native UTF-8 sorting according to the contents of the key portion of the emitted content. The basic order of output is as follows:

    • null
    • false
    • true
    • Numbers
    • Text (case sensitive, lowercase first)
    • Arrays (according to the values of each element, in order)
    • Objects (according to the values of keys, in key order)

    Request:

    1. GET /db/_design/test/_view/sorting HTTP/1.1
    2. Accept: application/json
    3. Host: localhost:5984

    Response:

    You can reverse the order of the returned view information by using the descending query value set to true:

    Request:

    1. GET /db/_design/test/_view/sorting?descending=true HTTP/1.1
    2. Accept: application/json
    3. Host: localhost:5984

    Response:

    1. HTTP/1.1 200 OK
    2. Cache-Control: must-revalidate
    3. Content-Type: application/json
    4. Date: Wed, 21 Aug 2013 10:09:25 GMT
    5. ETag: "Z4N468R15JBT98OM0AMNSR8U"
    6. Server: CouchDB (Erlang/OTP)
    7. Transfer-Encoding: chunked
    8. {
    9. "rows": [
    10. "id": "dummy-doc",
    11. "key": {
    12. "foo": "bar"
    13. },
    14. "value": null
    15. },
    16. {
    17. "id": "dummy-doc",
    18. "key": {},
    19. "value": null
    20. },
    21. {
    22. "id": "dummy-doc",
    23. "key": [
    24. 3
    25. ],
    26. "value": null
    27. },
    28. {
    29. "id": "dummy-doc",
    30. "key": [
    31. 2,
    32. 3
    33. ],
    34. "value": null
    35. },
    36. {
    37. "id": "dummy-doc",
    38. "key": [
    39. 1,
    40. 2,
    41. 3
    42. ],
    43. "value": null
    44. },
    45. {
    46. "id": "dummy-doc",
    47. "key": [],
    48. "value": null
    49. },
    50. {
    51. "id": "dummy-doc",
    52. "key": "\u043f\u0440\u0438\u0432\u0435\u0442",
    53. "value": null
    54. },
    55. {
    56. "id": "dummy-doc",
    57. "key": "Hello",
    58. "value": null
    59. },
    60. {
    61. "id": "dummy-doc",
    62. "key": "hello",
    63. "value": null
    64. },
    65. {
    66. "id": "dummy-doc",
    67. "key": "10",
    68. "value": null
    69. },
    70. {
    71. "id": "dummy-doc",
    72. "key": 42,
    73. "value": null
    74. },
    75. {
    76. "id": "dummy-doc",
    77. "key": 10,
    78. "value": null
    79. },
    80. {
    81. "id": "dummy-doc",
    82. "key": 1,
    83. "value": null
    84. },
    85. {
    86. "id": "dummy-doc",
    87. "key": 0,
    88. "value": null
    89. },
    90. {
    91. "id": "dummy-doc",
    92. "key": true,
    93. "value": null
    94. },
    95. {
    96. "id": "dummy-doc",
    97. "key": false,
    98. "value": null
    99. },
    100. {
    101. "id": "dummy-doc",
    102. "key": null,
    103. "value": null
    104. }
    105. ],
    106. "total_rows": 17
    107. }

    The sorting direction is applied before the filtering applied using the startkey and endkey query arguments. For example the following query:

    1. GET http://couchdb:5984/recipes/_design/recipes/_view/by_ingredient?startkey=%22carrots%22&endkey=%22egg%22 HTTP/1.1
    2. Accept: application/json
    1. GET /recipes/_design/recipes/_view/by_ingredient?descending=true&startkey=%22carrots%22&endkey=%22egg%22 HTTP/1.1
    2. Accept: application/json
    3. Host: localhost:5984
    4. {
    5. "total_rows" : 26453,
    6. "rows" : [],
    7. "offset" : 21882
    8. }

    The results will be empty because the entries in the view are reversed before the key filter is applied, and therefore the endkey of “egg” will be seen before the startkey of “carrots”, resulting in an empty list.

    Instead, you should reverse the values supplied to the startkey and endkey parameters to match the descending sorting applied to the keys. Changing the previous example to:

    1. GET /recipes/_design/recipes/_view/by_ingredient?descending=true&startkey=%22egg%22&endkey=%22carrots%22 HTTP/1.1
    2. Accept: application/json
    3. Host: localhost:5984

    1.5.4.3.2. Raw collation

    By default CouchDB uses an driver for sorting view results. It’s possible use binary collation instead for faster view builds where Unicode collation is not important.

    To use raw collation add "collation": "raw" key-value pair to the design documents options object at the root level. After that, views will be regenerated and new order applied.

    By default, views return all results. That’s ok when the number of results is small, but this may lead to problems when there are billions results, since the client may have to read them all and consume all available memory.

    But it’s possible to reduce output result rows by specifying limit query parameter. For example, retrieving the list of recipes using the by_title view and limited to 5 returns only 5 records, while there are total 2667 records in view:

    Request:

    Response:

    1. HTTP/1.1 200 OK
    2. Cache-Control: must-revalidate
    3. Content-Type: application/json
    4. Date: Wed, 21 Aug 2013 09:14:13 GMT
    5. ETag: "9Q6Q2GZKPH8D5F8L7PB6DBSS9"
    6. Server: CouchDB (Erlang/OTP)
    7. Transfer-Encoding: chunked
    8. {
    9. "offset" : 0,
    10. "rows" : [
    11. {
    12. "id" : "3-tiersalmonspinachandavocadoterrine",
    13. "key" : "3-tier salmon, spinach and avocado terrine",
    14. "value" : [
    15. null,
    16. "3-tier salmon, spinach and avocado terrine"
    17. ]
    18. },
    19. {
    20. "id" : "Aberffrawcake",
    21. "key" : "Aberffraw cake",
    22. "value" : [
    23. null,
    24. "Aberffraw cake"
    25. ]
    26. {
    27. "id" : "Adukiandorangecasserole-microwave",
    28. "key" : "Aduki and orange casserole - microwave",
    29. "value" : [
    30. null,
    31. "Aduki and orange casserole - microwave"
    32. ]
    33. },
    34. {
    35. "id" : "Aioli-garlicmayonnaise",
    36. "key" : "Aioli - garlic mayonnaise",
    37. "value" : [
    38. null,
    39. ]
    40. },
    41. {
    42. "id" : "Alabamapeanutchicken",
    43. "key" : "Alabama peanut chicken",
    44. "value" : [
    45. null,
    46. "Alabama peanut chicken"
    47. ]
    48. }
    49. ],
    50. "total_rows" : 2667
    51. }

    To omit some records you may use skip query parameter:

    Request:

    1. GET /recipes/_design/recipes/_view/by_title?limit=3&skip=2 HTTP/1.1
    2. Accept: application/json
    3. Host: localhost:5984

    Response:

    1. HTTP/1.1 200 OK
    2. Cache-Control: must-revalidate
    3. Content-Type: application/json
    4. Date: Wed, 21 Aug 2013 09:14:13 GMT
    5. ETag: "H3G7YZSNIVRRHO5FXPE16NJHN"
    6. Server: CouchDB (Erlang/OTP)
    7. Transfer-Encoding: chunked
    8. {
    9. "offset" : 2,
    10. "rows" : [
    11. {
    12. "id" : "Adukiandorangecasserole-microwave",
    13. "key" : "Aduki and orange casserole - microwave",
    14. "value" : [
    15. null,
    16. "Aduki and orange casserole - microwave"
    17. ]
    18. },
    19. {
    20. "id" : "Aioli-garlicmayonnaise",
    21. "key" : "Aioli - garlic mayonnaise",
    22. "value" : [
    23. null,
    24. "Aioli - garlic mayonnaise"
    25. ]
    26. },
    27. {
    28. "id" : "Alabamapeanutchicken",
    29. "key" : "Alabama peanut chicken",
    30. "value" : [
    31. null,
    32. "Alabama peanut chicken"
    33. ]
    34. }
    35. ],
    36. "total_rows" : 2667
    37. }

    New in version 2.2.

    POST /{db}/_design/{ddoc}/_view/{view}/queries

    Executes multiple specified view queries against the view function from the specified design document.

    Parameters:
    • db – Database name
    • ddoc – Design document name
    • view – View function name
    Request Headers:
     
    Request JSON Object:
     
    • queries – An array of query objects with fields for the parameters of each individual view query to be executed. The field names and their meaning are the same as the query parameters of a regular view request.
    Response Headers:
     
      • application/json
    • ETag – Response signature
    • chunked
    Response JSON Object:
     
    • results (array) – An array of result objects - one for each query. Each result object contains the same fields as the response to a regular view request.
    Status Codes:
    • – Request completed successfully
    • 400 Bad Request – Invalid request
    • – Read permission required
    • 404 Not Found – Specified database, design document or view is missing
    • – View function execution error
    1. POST /recipes/_design/recipes/_view/by_title/queries HTTP/1.1
    2. Content-Type: application/json
    3. Accept: application/json
    4. Host: localhost:5984
    5. {
    6. "queries": [
    7. {
    8. "keys": [
    9. "meatballs",
    10. "spaghetti"
    11. ]
    12. },
    13. {
    14. "limit": 3,
    15. "skip": 2
    16. }
    17. ]
    18. }

    Response:

    1. HTTP/1.1 200 OK
    2. Cache-Control: must-revalidate
    3. Content-Type: application/json
    4. Date: Wed, 20 Dec 2016 11:17:07 GMT
    5. ETag: "1H8RGBCK3ABY6ACDM7ZSC30QK"
    6. Server: CouchDB (Erlang/OTP)
    7. Transfer-Encoding: chunked
    8. {
    9. "results" : [
    10. {
    11. "offset": 0,
    12. "rows": [
    13. {
    14. "id": "SpaghettiWithMeatballs",
    15. "key": "meatballs",
    16. "value": 1
    17. },
    18. {
    19. "id": "SpaghettiWithMeatballs",
    20. "key": "spaghetti",
    21. "value": 1
    22. },
    23. {
    24. "id": "SpaghettiWithMeatballs",
    25. "key": "tomato sauce",
    26. "value": 1
    27. }
    28. ],
    29. "total_rows": 3
    30. },
    31. {
    32. "offset" : 2,
    33. "rows" : [
    34. {
    35. "id" : "Adukiandorangecasserole-microwave",
    36. "key" : "Aduki and orange casserole - microwave",
    37. "value" : [
    38. null,
    39. "Aduki and orange casserole - microwave"
    40. ]
    41. },
    42. {
    43. "id" : "Aioli-garlicmayonnaise",
    44. "key" : "Aioli - garlic mayonnaise",
    45. "value" : [
    46. null,
    47. "Aioli - garlic mayonnaise"
    48. ]
    49. },
    50. {
    51. "id" : "Alabamapeanutchicken",
    52. "key" : "Alabama peanut chicken",
    53. "value" : [
    54. null,
    55. "Alabama peanut chicken"
    56. ]
    57. }
    58. ],
    59. "total_rows" : 2667
    60. }