emit()
関数はmapフェーズでビューの情報のレコードを作成するために使用されますが、格納された各ドキュメントからひとつ以上の情報を問い合わせることを可能にするためにmapフェーズで複数回呼び出されます。
この例はソースドキュメントが情報の配列を含むときです。たとえば、レシピのドキュメント内で、食材のリストがオブジェクトの配列として公開されています。食材を反復することで、食材のインデックスを作成することができ、あとで食材によってレシピを探すのに使用します。
{ "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": "" } ], }
次のmap()
関数を使用して、ビューを作成することができますj:
function(doc, meta) { if (doc.ingredients) { for (i=0; i < doc.ingredients.length; i++) { emit(doc.ingredients[i].ingredient, null); } } }
特定の食材で問い合わせるためには、キーとして食材を指定します:
?key="carrot"
keys
パラメータは、複数の食材が含まれているレシピを探すために、このような状況で使用することもできます。たとえば、"potatoes" か "chilli powder"のどちらかを含んだレシピを探すには、次を使用します:
?keys=["potatoes","chilli powder"]
これは、いずれかの食材を含んだドキュメントのリストを作成します。クライアントによるドキュメントIDの単純なカウントは、レシピが3つすべてを含んでいるかを判断できます。
出力を組み合わせることもできます。たとえば、ニンジンが含まれており、20分以内で調理できるレシピを探すために、ビューは次のように書き換えることができます:
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); } } } }
このmap関数では、食材名、およびレシピの総調理時間の両方の配列を出力します。元のクエリを実行するため、調理時間が20分未満のニンジンレシピは:
?startkey=["carrot",0]&endkey=["carrot",20]
これは、次のビューを生成します:
{"total_rows":26471,"rows":[ {"id":"Mangoandcarrotsmoothie","key":["carrots",5],"value":null}, {"id":"Cheeseandapplecoleslaw","key":["carrots",15],"value":null} ] }