1

私のソファには、次のようなドキュメント ペアがあります。

{
  _id: "DOCID",
  type: "Task",
  info: { k1: "v1", k2: "v2" }
}
{ 
  _id: "ANOTHER DOCID",
  type: "Final",
  task: "DOCID",
  author: "Authorname"
}

著者の場合、これらのペアがいくつか存在する可能性があります。

authorここで、が を伴うという方法で結合された情報を提供するビューが必要ですinfo

ビューのコロケーションを使用して、次のビューを作成しました。

function(doc) {
  if (doc.doc_type == "Final")
    emit([doc.task, 0], doc.author);
  if (doc.doc_type == "Task")
    emit([doc._id, 1], doc.definition);
}

そして、次のような結果が得られます。

["153b46415108e95c811e1d4cd018624f", 0] -> "Authorname"
["153b46415108e95c811e1d4cd018624f", 1] -> { info here }

最初に、reduce 関数を使用して両方を 1 つに統合しましたが、タイミングを合わせた後、それらをローカルにグループ化する方がはるかに高速です。

ただし、現状では、このビューを「作成者名」で照会することはできません。特にinfo著者名が付いていないため、そうではありません。

したがって、これにはいくつかの解決策があると思います:

  1. グループ化でreduce関数を使用し、キーを操作して作成者を表示します(グループ化されたキーの操作が可能かどうかさえわかりません)
  2. すべての行を取得し、それらをローカルにグループ化し、探している作成者をフィルタリングします (不要なオーバーヘッドが多すぎる可能性があります)。
  3. 複数のビューを持ち、2 つのクエリを実行します。1 つは DOCID を取得し、次に DOCID をクエリします。
  4. 連結されたビューをスマートにクエリします。効率的な方法で Authorname をキーと種類のクエリに含めますが、 Authorname のクエリでは実際のinfo.

では、これについて何を続けることをお勧めしますか? はい、情報が分離されているのには理由があります (複数のFinalドキュメントが同じドキュメントに関連している可能性があるTaskため、同じ情報を持っている可能性があります)。

一番

編集 提供されたソリューションは私の質問に答えますが、ビューを使用してコード (Django ビュー) で結果をグループ化すると、非常に高速であることがわかりました!

4

1 に答える 1

0

私は今、著者が情報を伴っているという方法で結合された情報を私に与えるビューを必要としています。

したがって、要件を正しく理解していれば、

  1. ビューは作成者名で照会する必要があります。

  2. 出力結果は、作成者の名前とINFOドキュメントである必要があります。

ドキュメントは、リンクされたドキュメントの検索をサポートするように完全に構​​造化されています

私はこのマップ機能がそれを行うべきだと思います

function(doc) {

if(doc.author){
  emit(doc.author,{_id:doc.task});

}

ここでクエリを実行するとinclude_docs=true、結果が得られます

 {
  total_rows: 1,
  offset: 0,
  rows: [
    {
      id: "19ae88d060834dafdea9417384e2db20",
      key: "Authorname",
      value: { _id: "DOCID" },
      doc: {
        _id: "DOCID",
        _rev: "1-d7fe42dd7858238bb2d1112abf24f046",
        type: "Task",
        info: { k1: "v1", k2: "v2" }
      }
    }
  ]
}

reduce については、couchdb wikiから

reduce 関数は、入力値をより小さな出力値に減らす必要があります。reduce で複合戻り構造を構築している場合、または値フィールドを要約するのではなく変換するだけの場合は、この機能を誤用している可能性があります。

コメントに基づいて編集:-

タスク ドキュメントが大きすぎてすべてを取得したくない場合は、2 つの方法があります。

  1. 著者に直接情報を埋め込みます。タスクから必要なのは情報部分だけなので。Couchdb やその他の SQL を使用しないデータベースは、アクセスを容易にするためにデータの非正規化を促進します。

  2. list 関数を使用して、大きな json 出力を使用可能な形式に変更します。

于 2014-06-25T05:38:08.510 に答える