2016-07-17 11 views
0

私はCouchDBの1.6.1で、これに類似した文書を持っている:CouchDBのビュー(マップ/削減)

"_id": "test_test", 
"_rev": "4-8eb22214f7f3dccd3c979f95ded0a7b0", 
"test": { 
    "sample": { 
     "abc": { 
      "aaa": 877, 
      "bbb": 202, 
      "ccc": 0, 
      "ddd": 362, 
      "eee": 242, 
      "ggg": 81 
     }, 
     "def": { 
      "aaa": 697, 
      "bbb": 233, 
      "ccc": 0, 
      "ddd": 178, 
      "eee": 90, 
      "ggg": 5 
     }, 
     "ghi": { 
      "aaa": 987, 
      "bbb": 396, 
      "ccc": 0, 
      "ddd": 399, 
      "eee": 178, 
      "ggg": 108 
     }, 
     "jkl": { 
      "aaa": 1165, 
      "bbb": 332, 
      "ccc": 0, 
      "ddd": 286, 
      "eee": 173, 
      "ggg": 100 
     }, 

私は、このようなからデータを抽出したい:

1) 

"test": { 
"sample": { 
    "abc": { 
     "aaa": 877, 
    "def": { 
     "aaa": 697, 
    "ghi": { 
     "aaa": 987, etc. 

か:

2) 
"test": { 
"sample": { 
    "def": { 
     "aaa": 697, 
     "bbb": 233, 
     "ccc": 0, 
     "ddd": 178, 
     "eee": 90, 
     "ggg": 5 
    }, 

また、'test'のすべてのドキュメント、または'sample'またはすべてのドキュメントの合計を得ることもできます'def'のドキュメント、または'aaa'のすべてのドキュメント

は、私は次のようにJavaScriptのマップがあります。

function(doc) { 
if(doc.test.sample.abc.aaa){ 
emit(null, doc.test.sample.abc.aaa); 
} 
} 

をこれは正しく私も試してみました(877)

単一の値を与えるを

function(doc) { 
for (var i in doc.test.sample.abc){ 
emit(doc.test.sample.abc[i], null); 
} 
} 

得ることを望ん:

"aaa": 877, 
"bbb": 202, 
"ccc": 0, 
"ddd": 362, 
"eee": 242, 
"ggg": 81 

ソム1つはmap/reduceで成功し、時には何も動作しません。

フィールドをループするのは難しいようです。

ご協力いただければ幸いです。

編集

CouchDB The Definitive Guide

{ 
"_id": "_design/app", 
"_rev": "1-b20db05077a51944afd11dcb3a6f18f1", 
"filters": { 
"important": "function(doc, req) { if(doc.priority == 'high') { return true; } 
else { return false; }}" 
} 
} 

の "変更通知、フィルタ" セクションからサンプルコード私はCouchDBのにこのコードを貼り付けた場合、それが拒否されます。 JSONLintテストにも失敗します。 私は同じ結果でそれを細分化しようとしました。 私はここで何が見えないのですか? 下記の「回答2」に引用されているコードJSONLintテストをパスし、CouchDBはそれを受け入れます。 しかし、特定の機能を入力するとすぐに問題が発生します。 これに対処する方法はありますか。 もう一度多くのおかげです。

EDIT2

私はほぼ存在しています?

このコードは、ソファーで受け入れられている:

{ 
"_id": "_design/lists", 
"_rev": "3-628dc2f53051971994043c2e0bfc44ea", 
"language": "javascript", 
"views": { 
    "list_setup": { 
     "map": "function(doc) {if(doc.compartment.number){ emit(null, doc.compartment.number);}}" 
    } 
}, 
"lists": { 
    "first_list": "function(head, req) {var result = []; while (row = getRow()) { if (row !== null) { row.key + row.value else{ send(JSON.stringify({status_code: 404}));}}send(JSON.stringify(result));}}" 
} 
} 

私はカール実行する場合は、私は、関数のrow.key + row.value一部をどうするかわからない

{"error":"compilation_error","reason":"Expression does not eval to a function. (function(head, req) {var result = []; while (row = getRow()) { if (row !== null) { row.key + row.value else{ send(JSON.stringify({status_code: 404}));}}send(JSON.stringify(result));}})"} 

を取得します。

申し訳ありませんが、これは長くかかりました。

+0

私に質問を明確にすることはできますか? test.sample.abcチャイルドのマッピング関数のヘルプが必要ですか? –

+0

AlexisCôté私は、上記のオプション1)を得ることを手助けする必要があります。 – jlb333333

答えて

0

最初のオプションを達成するには、地図とリスト機能の組み合わせを使用できます。あなたがもう少し具体的なビューを照会するwhant場合は、この特定の値を放出する必要があるすべてのドキュメント

function(doc){ 
    emit(null, doc._id); 
} 

のインデックスを作成するマップ機能付き

次の部分はリスト機能です。 "include_docs = true"でビューを照会すると、ドキュメント全体が戻されます。これを基に、リスト関数を使用して「前」の結果をフォーマットすることができます。マップ関数のすべての結果は、オブジェクトを含む配列内にあります(すべてのオブジェクトは、文書に相当する です)。

これは私のリスト機能のパターンです:

function(head, req) { 
    var result = []; 

    while (row = getRow()) { 
     if (row !== null) { 
     // make your formatting here 
     else{ 
     send(JSON.stringify({ 
      status_code: 404 
     })); 
     } 
    } 

    send(JSON.stringify(result)); 
} 

最終クエリは、この

カール-X GET -g "http://[host]:[port]/[db]/_design/[ddoc名]/_リスト/ [リストFUNC名]/[地図FUNCのように見えます名前]真[クエリ] & include_docs =」ここで参照する、公式ドキュメントとして

:?ここhttp://docs.couchdb.org/en/1.6.1/api/ddoc/render.html#db-design-design-doc-list-list-name-view-name

+0

セセダ。どうもありがとう。ちょうど私のために進んだ。 – jlb333333

+0

実際、理解するのは難しいことではありません。私のリスト機能のパターンを恐れてはいけません。 まず、JSON形式のJavaScriptを使用して連絡を取ることをおすすめします。より良い理解のために、あなたの最初の文書を一方の側に置き、他方の側にはあなたが実際に望むものを置きます。その後、JavaScriptを使用してすべてをフォーマットする方法を見てください。ヒントJavaScriptのJSONドキュメントはオブジェクトと配列です。したがって、ドキュメントを並べ替えるだけで済みます。あなたは私のリストの機能パターンにコードを入れている場合。 http://www.json.org/ http://eloquentjavascript.net/1st_edition/chapter4.html – Sceada

+0

基本的に私は布団でこれを設定する方法を知らなかった。さまざまなウェブサイトやあなたの参考文献は説明がついていましたが、リストコードをどこに挿入するのか分かりませんでした。あなたのマップ機能を挿入した新しいビューを設定しましたが、リスト(または表示)コードをどこに設定するかはわかりません。それは布団の「地図」エリアに来るのでしょうか?私はまたマップ関数の下のリストとしてそれを挿入しようとしましたが、それを正しく設定することができず、布団はそれを受け入れませんでした。あなたのご意見ありがとうございました。 – jlb333333

0

でのcompletですe設計文書に含まれる可能性があるすべての機能の参照。 )括弧を忘れていないことを願っています。

{ 
    "_id": "_design/[ddoc name]", 

    "views": { 
     "[view name]": { 
     "map": "[map function]" 
     } 
    }, 
    "language": "javascript", 
    "lists": { 
     "[list name]": "[list function]" 
    }, 
    "shows": { 
     "[show name]": "[show function]" 
    }, 
    "updates": { 
     "[update name]": "[update function]" 
    }, 
    "filters": { 
     "[filter name]": "[filter function]" 
    } 
} 

JavaScriptコードを小さくすることも非常に重要です。

+0

こんにちは@セサダ。上記の私の編集をご覧ください。御苦労さまこれは明らかにCouchDBの重要な部分です。 – jlb333333

+0

こんにちは@Sceada。上記のedit2をご覧ください。それは私に長い時間がかかりました。あなたの忍耐がまだ抱きしめているなら。 – jlb333333

0

ご迷惑をおかけしました。私は休暇中でした。構文が正しくありません。

function(head, req) { 
    var result = []; 
    while (row = getRow()) { 
     if (row !== null) { 
      // This is not correct, you have to assigne the result to a 
      // variable. 
      // You also have to assigne something to the array result. 
      // result.append(); 
      // So if row.key and row.value are both numbers and you want 
      // the result you have to write 
      // temp = row.key + row.value; 
      // result.append(temp); 
      //row.key + row.value 
     }else { 
      send(JSON.stringify({ 
       status_code: 404 
      })); 
     } 
    } 
    send(JSON.stringify(result)); 
    } 
} 
関連する問題