CouchDBのビューをDRYするにはどうすればいいですか?

couchdb dry javascript

CouchDBのビュー間でコードを共有するために何ができますか?

例1 – 効用メソッド

function dot(attr){return function(obj){return obj [attr]; }}

Array.prototype.map = function(func){var i、r = []、(i = 0; i <this.length; i = 1){r [i] = func(this [i]); rを返します。 ;

...

すべてのビューがアクセスできるように、このコードをどこに置くことができますか?

例2 – 定数

私のアプリケーションで使用する定数についても同様です。 どこに置きますか

MyApp = {A_CONSTANT = "..."; ANOTHER_CONSTANT = "..."; ;

例3 – フィルタのフィルタ

「これは裕福な人ですか?」でフィルタリングする1つのビューが必要な場合はどうなりますか。

function(doc){if(doc.type == 'person'

もう1つは姓でインデックスを付けます。

function(doc){if(doc.last_name){emit(doc.last_name、doc); }}

どうやってそれらを結合して「姓の裕福な人々」の見方にすることができますか?

私は一種のRubyと同等のものが欲しい

my_array.select {| x | x.person? {| x |を選択します。 x.net_worth> 1,000,000} .map {| x | [x.last_name、x]}

どうやってDRYerになれますか?

  18  4


ベストアンサー

https://caolan.org/posts/commonjs_modules_in_couchdb.html[このブログ記事]に従って、libというキーを持つことでcouchdb 1.1のビューで* map関数*(ただしreduce関数は除く)にcommonjsモジュールを追加できます。あなたのビューオブジェクトに。 underscore.jsのような一般的なjavascriptライブラリの多くはcommonjs標準に準拠しているので、_require( "views / lib / [your module name]")_を使うことであなたのビューでそれらを使うことができます。

次のように、ビューのlibオブジェクトにunderscore.jsを “underscore”として含めるとします。

views:{lib:{underscore: "// Underscore.js 1.1.6 \ n ... ... [残りのあなたの見解はここに行く]}

その後、_モジュールにアクセスするためにビューに次のコードを追加します。

var _ = require( "views / lib / underscore");

カスタムライブラリの場合、あなたがしなければならないのはあなたがあなたのライブラリで共有したいものがグローバルな “エクスポート”オブジェクトへの値になることだけです。

22


CouchDB Wikiから:

_
ビュー間でコード/機能を共有する開発計画はありません。 各ビュー関数は、それらのバイト表現のハッシュに従って格納されます。そのため、関数が追加コードをロードせず、バイト文字列を変更せずに動作を変更することが重要です。 それゆえhttp://github.com/couchapp/couchapp[CouchApp]のユースケース。
_

8


答えはhttp://github.com/couchapp/couchapp[couchapp]にあります。 couchappを使えば、共通のライブラリコードを含むマクロを任意の設計ドキュメントセクションに埋め込むことができます。 設計文書がサーバーに送信される前に行われます。 あなたが尋ねる質問をするためにあなたがする必要があるのはあなたが「ネットワーク」で範囲質問をすることができるように発行されるキーを逆にすることです

function(doc)
{
  if (doc.type == 'person')
  {
    emit([doc.net_worth, doc.lastname], null);
  }
}

クエリパラメータに `include_docs = true`でできるドキュメントを含めたくありません。 そして、あなたはdoc.idをキーの一部として無料で手に入れることができます。 これで、このようなものになるだろうnetworth上で範囲クエリを実行できます。

http://localhost:5984/database/_design/people/_view/by_net_worth?startkey=[1000000]&endkey=[{},{}]&include_docs=true

3


Couchappはライブラリ内で「マクロ」を作成します。これは非常にうまく機能します。

もう1つの_unsupported_オプションは、そのようなユーティリティ関数をカスタムクエリサーバーに追加することです。 JSファイルはそれほど難しくありません、そしてRubyとPythonのバージョンはもっと単純です。 ビューサーバは実行時に設計ドキュメント内の文字列を関数オブジェクトにコンパイルします。したがって、ユーティリティ関数、定数などを使用してこれらの関数を閉じると、それらはmap / reduce / show / list関数で実行可能になります。

main emitファイルの中で “emit”と “log”が定義されている場所を探し、それらの関数の定義をエミュレートしてカスタムユーティリティ関数をマップに公開し、ラムダを減らします。

警告:ビューを再構築せずにビューサーバーを変更すると、ビューインデックスが正しくなくなります。 プログラマは注意してください。

1


ビューはデータベースに格納されており、ビューのキーはそれ自体のハッシュであるため、これはできません(最後に確認しました)。 ビューが変更された場合、ビューは異なり、一致しないため、ビューは外部のデータ/ロジック/プログラミングに依存することはできません。 それは私を混乱させ、そして今もそうしているので、私は間違っているかもしれません。

-2


タイトルとURLをコピーしました