2017-01-05 22 views
0

ID(子リスト)のリストを含むドキュメントをバケットに入れました。 このリストを照会しての結果をのようにJS80のようにしておきます。couchbaseから注文された結果を得る方法

String query = new StringBuilder().append("SELECT B.name, META(B).id as id ") .append("FROM "+ bucket.name()+" A ") .append("USE KEYS $id ") .append("JOIN "+ bucket.name()+" B ON KEYS ARRAY i FOR i IN A.childList end;").toString();

このクエリは、私が私に変身します行を返します。私のクエリは、(JavaのSDKを使用して)のようなものですドメインオブジェクトと、このようなリストを作成するには:

n1qlQueryResult.allRows().forEach(n1qlQueryRow -> (add to return list) ...); 

問題出力ためが重要です。

アイデア?

ありがとうございます。ここ

+0

単にクエリの最後に 'ORDER BY'句を追加することができます。https://developer.couchbase.com/documentation/server/current/n1ql/n1ql-language-reference/orderby .html –

+0

リストは文字列のリストです。それをchlidList としましょう。最初の行にchildList [0]が必要です。 ORDER BY句を使用する場合は、文字列の順序を使用して順序付けられます。 – user6479138

+0

あなたは常に1つの文書から始めますか?もしそうなら、なぜN1QLクエリの代わりにk/v演算を実行しないのですか?あなたはB文書をフェッチする順序でより多くのコントロール対ジョインを取得します... –

答えて

0

あなたは常に単一の文書から開始してN1QLない溶液の目安です:

List<JsonDocument> listOfBs = bucket 
     .async() 
     .get(idOfA) 
     .flatMap(doc -> Observable.from(doc.content().getArray("childList"))) 
     .concatMapEager(id -> bucket.async().get(id)) 
     .toList() 
     .toBlocking().first(); 

あなたはtoList前に別のmapは、名前とIDを抽出するために、または実行することをお勧めしますあなたのドメインオブジェクトの変換にも多分...

手順は次のとおりです。

  1. は、非同期API
  2. を使用します
  3. 文書
  4. が非同期でそれぞれの子文書を取得し、それらにをストリーミングするが、元の順序で
  5. それらを保つ子のリストを抽出し、これらのID
  6. をストリーム取得はまでList<JsonDocument>
  7. ブロックに全て集めますリストは準備が整っていて、そのリストを返します。
+0

ありがとうございました。それはたくさんの助けになりました。 – user6479138

+0

ページ分割の結果はどうですか? k/v操作でそれを行う方法はありますか? – user6479138

+0

参照先のドキュメントを意味していますか?フラットマップのfrom()の後にスキップしてrx演算子を使うことができます –

関連する問題