2017-03-13 7 views
2

Iは、以下の文書構造を持つ小さなCouchDBのテーブルを有する:CouchDBのバージョン= value2の

{ 
    "_id": "22e5cfffa3d363bb1dd3f2293e002953", 
    "idRubric": "9bf94452c27908f241ab559d2a0d46c5", 
    "category": "open", 
    "yada yada" : "for the rest of the fields" 
} 

(現在は)4つの可能なカテゴリの値との41個の可能な値が存在しますidRubric。 idRubricとカテゴリが同時に指定された値に一致するドキュメントのみを選択できるビューを作成しようとしています。現在のマップ関数は次のようになります。

{ 
    "_id": "_design/views", 
    "_rev": "40-97b9c83b8016e4f71738bb64cbe6c754", 
    "views": { 
     "byRubricCategory": { 
      "map": "function (doc) { if (doc.idRubric && doc.category) {emit(doc.idRubric, doc.category); } }" 
     } 
    } 
} 

これは、ieRubricと一致するすべてのドキュメントを表示する配列です。 idRubricをカテゴリに置き換えた場合、そのカテゴリに一致するすべてのドキュメントを取得します。私は結果を[doc.idRubric, doc.category]と指定しようとしましたが、null値が返されます。 は勧告に従い、私は出力に配列を表示する文書を更新しました:

{ 
    "_id": "_design/views", 
    "views": { 
     "byRubricCategory": { 
      "map": "function (doc) { if (doc.idRubric && doc.category) {emit([doc.idRubric, doc.category], null); } }" 
     } 
    } 
} 

配列にEMITを変更した結果は、私が今、結果として空のセットを得ることです:

{ 
    "total_rows": 16, 
    "offset": 0, 
    "rows": [ 

    ] 
} 

マップの目的は、私が望んでいない1つの値にセットを減らすように見えるので、私はreduce関数を使用していません(私の限られた理解で)、私は結果セットを必要とします。 4つの文書を持ち、20-30を持つかもしれません。

私はすでにCouchDBとこのトピックについて20回以上話しましたが、すべてがキー1 ORキー2である複数のキークエリを参照しているように見えます。私は論理的ORではなく論理ANDに到達しようとしています。ありがとう。どのキーが指定されていない

代表値:

{ 
    "total_rows": 16, 
    "offset": 0, 
    "rows": [ 
    { 
     "id": "22e5cfffa3d363bb1dd3f2293e00380a", 
     "key": [ 
     "9bf94452c27908f241ab559d2a0d46c5", 
     "close" 
     ], 
     "value": null 
    }, 
    { 
     "id": "22e5cfffa3d363bb1dd3f2293e0045a7", 
     "key": [ 
     "9bf94452c27908f241ab559d2a0d46c5", 
     "content" 
     ], 
     "value": null 
    }, 
    { 
     "id": "22e5cfffa3d363bb1dd3f2293e002953", 
     "key": [ 
     "9bf94452c27908f241ab559d2a0d46c5", 
     "open" 
     ], 
     "value": null 
    }, 
    { 
     "id": "22e5cfffa3d363bb1dd3f2293e0088a4", 
     "key": [ 
     "9bf94452c27908f241ab559d2a0d50d6", 
     "rising" 
     ], 
     "value": null 
    } 
    ] 
} 

答えて

3

これを達成するための最も簡単な方法は、このようなマップ機能である:

その後
function (doc) { 
    if (doc.idRubric && doc.category) { 
    emit([doc.idRubric, doc.category], null); 
    } 
} 

あなたが使用してドキュメントを見つける必要がありますstartkeyとendkey。

startkey = ["a", "b"] 
endkey = ["a", "b", {}] 

キーはjson文字列である必要があります。 endkeyの "{}"は他のオブジェクトを意味します。 idRubricが "a"、カテゴリが "b"に等しいオブジェクトに一致します。

また、私はキーとともに文書を発行しないことにも注意してください。発行された値をmap reduceに渡さない限り、実際にドキュメントをフェッチしたい場合、ドキュメントを発行する本当の理由はありません。つまり、発行された値に割り当てられたドキュメントでビューを取得できます。だから本当に価値を出す必要はありません。これにより、ビューのサイズも小さくなります。テキストコンテンツが10MBの文書がいくつかあるとします。あなたが文書全体を100回発行すると、あなたの文書は実際には10MB×100回= 1000MBのメモリを無駄にします。

また、idRubricおよびカテゴリテストの代わりに、ドキュメントに「タイプ」を追加して、オブジェクトが実際のものであることをより明示的にすることができます。

また、この使用することができます

http://localhost:5984/rubric_content/_design/views/_view/byRubricCategory?startkey=[%229bf94452c27908f241ab559d2a0d46c5%22,%22content%22]&endkey=[%229bf94452c27908f241ab559d2a0d46c5%22,%22content%22,{}]

代わりの "キー" を使用しています。あなたが複数のものを放出するセットを持っているときは良いことです。何らかの理由で、値を発行する順序も重要です。結果セットの順序が変更されます。 "key" = ["apple","cherry"]とクエリが最初の2つのキーを返します

key: ["apple","orange"] 
key: ["apple","orange"] 
key: ["apple","orange","cherry"] 
key: ["apple","lemon"] 

「キー」の上に私の方法の利点は、あなたがそのような何かを取り出すことができるということです。 startkey=["apple","orange"]のクエリと["apple","orange",{}]のエンドキーは、すべてのドキュメントがappleとorangeで始まるため、最初の3つのドキュメントを返します。これを念頭に置いて、startkeyendkeyが同じ場合は、 "key"のようになります。両方のキーを指定すると、より複雑なキー範囲を書くことができます。

また、ドキュメントを取得する場合は、URLに"include_docs=true"を追加してください。

+0

迅速な対応に感謝します。私はEMITの値の周りの括弧[]を使用する場合、私は空集合が返さ得る: { "TOTAL_ROWS":16、 "オフセット":0、 "行":[ ] } を角括弧を外しておくと、14個の文書(idRubric値を含むすべての文書)が返されます。あなたのマップ関数をテストするためにコピーしました。何か案は? –

+0

配列を発行する必要があります。 startkey/endkeyを付けずにビューを取得してみてください。また、取得しようとしているURLを投稿することもできます。また、あなたの質問の地図機能を更新してください。エンプセセットを返すもの。 –

+0

Loic:次のcurlコマンドを使用しています:curl http:// localhost:5984/rubric_content/_design/views/_view/byRubricCategory?key =%5B%229bf94452c27908f241ab559d2a0d46c5%22、%22open%22%5D' arrayを出力として指定する場合、結果は空のセットになります。 –

0

emitあなたの鍵としてです。これを行うには正しい方法です。その複合キーとビューのドキュメントを使って、curl host:5984/dbname/_design/views/_view/byRubricCategory?key=%5B%229bf94452c27908f241ab559d2a0d46c5%22,%22open%22%5D - ["]のすべてのCGIをエスケープします。

+0

ありがとうございますが、同じ問題が続いています。私がdoc.idRubric、doc.categoryを角括弧で囲むと、空の結果セットが得られます。 –

+0

あなたが入力しているものを正確に表示します。上記のように、完全な 'curl'コマンドを表示しました。 – smathy

1

ああ、答えはkey=私が使用して私のブラウザでこれをテストしてきたではないkeys=http://localhost:5984/rubric_content/_design/views/_view/byRubricCategory?keys=[%229bf94452c27908f241ab559d2a0d46c5%22,%22content%22]

エラーが鍵仕様です。これを修正すると http://localhost:5984/rubric_content/_design/views/_view/byRubricCategory?key=[%229bf94452c27908f241ab559d2a0d46c5%22,%22content%22]が問題を解決します。あなたの助けと忍耐のために皆、ありがとう。

+0

1週間はこれで苦労していて、それは鍵の欠落 "s"だった.... – Chiguireitor