The emit() function is used to create a
record of information for the view during the map phase, but it
can be called multiple times within that map phase to allowing
querying over more than one source of information from each
stored document.
An example of this is when the source documents contain an array of information. For example, within a recipe document, the list of ingredients is exposed as an array of objects. By iterating over the ingredients, an index of ingredients can be created and then used to find recipes by ingredient.
{ "title": "Fried chilli potatoes", "preptime": "5" "servings": "4", "totaltime": "10", "subtitle": "A new way with chips.", "cooktime": "5", "ingredients": [ { "ingredtext": "chilli powder", "ingredient": "chilli powder", "meastext": "3-6 tsp" }, { "ingredtext": "potatoes, peeled and cut into wedges", "ingredient": "potatoes", "meastext": "900 g" }, { "ingredtext": "vegetable oil for deep frying", "ingredient": "vegetable oil for deep frying", "meastext": "" } ], }
The view can be created using the following
map() function:
function(doc, meta) { if (doc.ingredients) { for (i=0; i < doc.ingredients.length; i++) { emit(doc.ingredients[i].ingredient, null); } } }
To query for a specific ingredient, specify the ingredient as a key:
?key="carrot"
The keys parameter can also be used in this
situation to look for recipes that contain multiple ingredients.
For example, to look for recipes that contain either "potatoes"
or "chilli powder" you would use:
?keys=["potatoes","chilli powder"]This will produce a list of any document containing either ingredient. A simple count of the document IDs by the client can determine which recipes contain all three.
The output can also be combined. For example, to look for recipes that contain carrots and can be cooked in less than 20 minutes, the view can be rewritten as:
function(doc, meta) { if (doc.ingredients) { for (i=0; i < doc.ingredients.length; i++) { if (doc.ingredients[i].ingredtext && doc.totaltime) { emit([doc.ingredients[i].ingredtext, parseInt(doc.totaltime,10)], null); } } } }
In this map function, an array is output that generates both the ingredient name, and the total cooking time for the recipe. To perform the original query, carrot recipes requiring less than 20 minutes to cook:
?startkey=["carrot",0]&endkey=["carrot",20]This generates the following view:
{"total_rows":26471,"rows":[ {"id":"Mangoandcarrotsmoothie","key":["carrots",5],"value":null}, {"id":"Cheeseandapplecoleslaw","key":["carrots",15],"value":null} ] }