2016-04-23 6 views
1

私はCouchbase Java SDK 2.2.6をCouchbaseサーバー4.1で使用します。Couchbaseのリアクティブクライアントはビューの検索結果の行の順序を保証しますか

私は行が常に行のキーでソートされていないことがわかりfromJsonDocument方法からログに次のコード

public <T> List<T> findDocuments(ViewQuery query, String bucketAlias, Class<T> clazz) { 
    // We specifically set reduce false and include docs to retrieve docs 
    query.reduce(false).includeDocs(); 
    log.debug("Find all documents, query = {}", decode(query)); 
    return getBucket(bucketAlias) 
      .query(query) 
      .allRows() 
      .stream() 
      .map(row -> fromJsonDocument(row.document(), clazz)) 
      .collect(Collectors.toList()); 
} 

private static <A> A fromJsonDocument(JsonDocument saved, Class<A> clazz) { 
    log.debug("Retrieved json document -> {}", saved); 
    A object = fromJson(saved.content(), clazz); 
    return object; 
} 

と私のビューを問い合せます。通常はありますが、そうでない場合もあります。

私はブラウザのcouchbase GUIでこのクエリを実行するだけで、いつも期待通りの結果が得られます。バグか、非同期クライアントでクエリのクエリ結果がソートされないことが予想されますか? javaではなく、異なるクライアントでの動作は何ですか?

答えて

1

これは、Javaクライアントでの呼び出しの非同期性+ includeDocsを使用したためです。

includeDocsは、ビューから受け取った各ドキュメントIDに対してgetを呼び出して織ります。したがって、includeDocsを使用してAsyncViewRowの非同期シーケンスを見ると、ビューによって返された行の構成と、ドキュメント全体の非同期取得が実際に見えています。

文書検索で前の行と比較して少しの待ち時間がある場合は、(行+文書)排出を並べ替えることができます。

しかし、誰もが良いニュース! の代替品がにありますが、これはincludeDocsとまったく同じパラメーターをとりますが、AsyncViewRowがビューによって返される順序と同じになるようにします。

これは、getの検索を熱心にトリガーした後、到着したものをバッファリングして、パフォーマンスを犠牲にすることなく元の順序を維持することによって行われます。

これは、Javaクライアントに固有のもので、その使用方法はRxJavaです。私は他のクライアントがincludeDocsという概念を持っているかどうかもわかりません...

+0

ありがとうございます!今はバージョン2.2.5で追加されているのを見て、私はこの新しい方法を見逃しました。 –

関連する問題