私のソファには、次のようなドキュメント ペアがあります。
{
_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
著者名が付いていないため、そうではありません。
したがって、これにはいくつかの解決策があると思います:
- グループ化でreduce関数を使用し、キーを操作して作成者を表示します(グループ化されたキーの操作が可能かどうかさえわかりません)
- すべての行を取得し、それらをローカルにグループ化し、探している作成者をフィルタリングします (不要なオーバーヘッドが多すぎる可能性があります)。
- 複数のビューを持ち、2 つのクエリを実行します。1 つは DOCID を取得し、次に DOCID をクエリします。
- 連結されたビューをスマートにクエリします。効率的な方法で Authorname をキーと種類のクエリに含めますが、 Authorname のクエリでは実際の
info
.
では、これについて何を続けることをお勧めしますか? はい、情報が分離されているのには理由があります (複数のFinal
ドキュメントが同じドキュメントに関連している可能性があるTask
ため、同じ情報を持っている可能性があります)。
一番
編集 提供されたソリューションは私の質問に答えますが、ビューを使用してコード (Django ビュー) で結果をグループ化すると、非常に高速であることがわかりました!