rethinkdb | ネストされたクエリとチェーンされたクエリ、違いはありますか?

リト

連鎖の間に違いはありますか?

r.db('catbox').table("bw_mobile").filter(
    r.row("value")("appVersion")("major").le(2)
).filter(
  r.row("value")("appVersion")("minor").le(2)
).filter(
  r.row("value")("appVersion")("patch").le(10)
)

ネスト:

r.db('catbox').table("bw_mobile").filter(
      r.row("value")("appVersion")("major").le(2).and(
        r.row("value")("appVersion")("minor").le(2).and(
          r.row("value")("appVersion")("patch").le(10)
        )
      )
)

またはラムダ関数

r.db('catbox').table("bw_mobile").filter(
  r.js("(function (session) { 
        return session.value.appVersion.major < 0 
            || ( session.value.appVersion.major == 0 && session.value.appVersion.minor < 0 )
            || ( session.value.appVersion.major == 0 && session.value.appVersion.minor == 0 && session.value.appVersion.patch < 71 )
        ; 
    })")
)

TY!

Lyubomyr Shaydariv

2番目のケース(filter複数のand式を持つ単一)が最も効率的で最も使いやすいと思います。私は次の考えを考慮に入れます:

r.filter文書化されているように、に渡された述語関数の結果に関係なく常に新しい選択、ストリーム、または配列を作成しr.filterます。RethinkDBで選択がどのように実装されているかはわかりませんが(ストリームのようなものだと思います)、配列の連鎖は、中間配列を割り当てるコストのかかる操作になる可能性があります。これをArray.prototype.filter、結果として新しい配列を作成するものと比較してくださいストリームはレイジーであるため、各要素もレイジーに計算される(またはされない)ため、メモリフットプリントが小さくなります。(他の言語のイテレータ/ストリームと発電機とこれを比較Iterator<E>/ Stream<E>Javaで、IEnumerator<T>およびyield return.NET / C#、JavaScriptでイテレータとジェネレータ機能、にyieldPythonで、パイプ|シェルコマンドで。など)イテレータ/ジェネレータを組み合わせることができる場所。いずれにせよ、中間フィルターがあります。

単一の式で、一連の連鎖フィルター操作を置き換えることができます。r.and操作には、非常に重要な機能が1つあることに注意してください。これは、短絡評価操作です。AND演算の左側のオペランドがである場合、演算はfalse右側の式を評価する必要さえなく、常にそのような結果を得ることができますfalseでそんなことはできませんr.filterこれを、単一のクエリごとに1回指定できるSQL WHERE句と比較してください(すべてのfalseケースは、AND演算子によって単純に破棄できます)。また、実用的な観点から、便利な名前を付けてパラメータ化されたReQL式を返すファクトリメソッドを作成できます。ReQL式は不変で安全に再利用できるため、定数に割り当てることもできます。

const maxVersionIs = (major, minor, patch) => r.row("value")("appVersion")("major").le(major)
    .and(r.row("value")("appVersion")("minor").le(minor))
    .and(r.row("value")("appVersion")("patch").le(patch));

const versionPriorToMilestone = maxVersionIs(2, 2, 10);

...

.filter(maxVersionIs(major, minor, patch))

...

.filter(versionPriorToMilestone)

ReQL式RethinkDBクエリは、実際には、JavaScriptスクリプトを実行するよりも、解析がはるかに簡単で、実行プランに直接変換できる式ツリーです。公式ドキュメントで、パフォーマンスを向上させるために使用を避けること推奨さr.jsれています。ここでのコストは、JavaScriptランタイムのセットアップ、分離されたスクリプトの実行、およびスクリプトのタイムアウトのチェックだと思います。さらに、スクリプトはエラーが発生しやすくなりますが、式ツリーはコンパイル時に多かれ少なかれ検査される可能性があります。しかし、完全を期すために、r.jsReQLは限られた一連の操作であるため、これらのコストがあってもより強力になる可能性があります。私の個人的な経験から:RethinkDBに基づく一種の権限チェックサブシステムを実装する必要があり、RethinkDBでビット単位のAND演算を行う必要がありました。私が使用していたので、残念ながら、2.3のようRethinkDBは、ビットごとの演算をサポートしていませんr.jsr.js('(function (user) { return !!(user.permissions & ${permissions}); })')RethinkDBの将来のリリースではビット演算がサポートされるためr.getField('permissions').bitAnd(permissions))、将来的にはより高速に動作し他の式と組み合わせて1つに収まるようにする必要がありfilterます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ネストされたオブジェクトを制限すると、rethinkdbクエリが発生します

分類Dev

RethinkDBのネストされた値でドキュメントをクエリするにはどうすればよいですか?

分類Dev

RethinkDB:Javascript-ネストされたオブジェクトを削除する方法

分類Dev

RethinkDBネストされた配列の要素を更新します

分類Dev

フェザーJSのrethinkdbからネストされた配列オブジェクトを検索します

分類Dev

RethinkDBネストされたグループ化

分類Dev

2エポック時間の間にデータをフェッチするためのRethinkdbクエリ

分類Dev

RethinkDBの深くネストされたフィールドのインデックス作成

分類Dev

RethinkDBの深くネストされたフィールドのインデックス作成

分類Dev

rethinkdbクエリのfilter、sum、div

分類Dev

rethinkdbでのクエリの連鎖

分類Dev

RethinkDB pythonクエリは、データエクスプローラとは異なる結果を返します

分類Dev

RethinkDB-インポートされたMySQLタイムスタンプ文字列をTimeオブジェクトに変換します

分類Dev

RethinkDBのデータ構造

分類Dev

RethinkDBエラー:SyntaxError:引数リストの後に)がありません

分類Dev

RethinkDB:ネストされた構造の配列に追加する方法

分類Dev

ReQLを使用してRethinkDBのネストされた配列を更新する方法

分類Dev

Docker OS Xベータ版からrethinkdb(またはhttpポートで実行されている他のアプリ)に接続する

分類Dev

rethinkDBを使用した左結合クエリ

分類Dev

RethinkDB-クエリを次々に実行します

分類Dev

Rethinkdb:チェーンgetAll&between

分類Dev

Golang Rethinkdbネストフィルター

分類Dev

Rethinkdbクエリは常にnullを返しますEventhoughデータは存在しますか?

分類Dev

ドッキングされたRethinkdbへの接続

分類Dev

RethinkDBクエリの応答を合理的な方法で出力する

分類Dev

RethinkDB:多重比較フィルタリング

分類Dev

Rethinkdbは1つのクエリで複数の平均を実行します

分類Dev

Rethinkdb:ネストされたドキュメントのサブドキュメントを含める

分類Dev

GitHubプルリクエストが作成されたときにいくつかのチェックを自動的に実行する方法はありますか?

Related 関連記事

  1. 1

    ネストされたオブジェクトを制限すると、rethinkdbクエリが発生します

  2. 2

    RethinkDBのネストされた値でドキュメントをクエリするにはどうすればよいですか?

  3. 3

    RethinkDB:Javascript-ネストされたオブジェクトを削除する方法

  4. 4

    RethinkDBネストされた配列の要素を更新します

  5. 5

    フェザーJSのrethinkdbからネストされた配列オブジェクトを検索します

  6. 6

    RethinkDBネストされたグループ化

  7. 7

    2エポック時間の間にデータをフェッチするためのRethinkdbクエリ

  8. 8

    RethinkDBの深くネストされたフィールドのインデックス作成

  9. 9

    RethinkDBの深くネストされたフィールドのインデックス作成

  10. 10

    rethinkdbクエリのfilter、sum、div

  11. 11

    rethinkdbでのクエリの連鎖

  12. 12

    RethinkDB pythonクエリは、データエクスプローラとは異なる結果を返します

  13. 13

    RethinkDB-インポートされたMySQLタイムスタンプ文字列をTimeオブジェクトに変換します

  14. 14

    RethinkDBのデータ構造

  15. 15

    RethinkDBエラー:SyntaxError:引数リストの後に)がありません

  16. 16

    RethinkDB:ネストされた構造の配列に追加する方法

  17. 17

    ReQLを使用してRethinkDBのネストされた配列を更新する方法

  18. 18

    Docker OS Xベータ版からrethinkdb(またはhttpポートで実行されている他のアプリ)に接続する

  19. 19

    rethinkDBを使用した左結合クエリ

  20. 20

    RethinkDB-クエリを次々に実行します

  21. 21

    Rethinkdb:チェーンgetAll&between

  22. 22

    Golang Rethinkdbネストフィルター

  23. 23

    Rethinkdbクエリは常にnullを返しますEventhoughデータは存在しますか?

  24. 24

    ドッキングされたRethinkdbへの接続

  25. 25

    RethinkDBクエリの応答を合理的な方法で出力する

  26. 26

    RethinkDB:多重比較フィルタリング

  27. 27

    Rethinkdbは1つのクエリで複数の平均を実行します

  28. 28

    Rethinkdb:ネストされたドキュメントのサブドキュメントを含める

  29. 29

    GitHubプルリクエストが作成されたときにいくつかのチェックを自動的に実行する方法はありますか?

ホットタグ

アーカイブ