2017-01-05 15 views
0

У меня в моем ковше есть документ, содержащий список ID (childList). Я хотел бы запросить этот список, и сохранить результат заказа как в моем JSON. Мой запрос как (с помощью Java SDK):Как получить упорядоченные результаты от 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();

Этот запрос будет возвращать строки, которые я превратят в мой объект домена и создать список, как это:

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

Список представляет собой список String. Назовем его chlidList . Мне нужно, чтобы childList [0] был первой и так далее. Если я буду использовать предложение ORDER BY, он будет упорядочен, используя порядок строк. – user6479138

+0

Вы всегда начинаете с одного документа для присоединения? Если да, почему бы не выполнить операции k/v вместо запроса N1QL? вы получите больше контроля против JOIN в том порядке, в котором вы получаете документы 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(); 

Вы могли бы хотеть другой map перед toList, чтобы извлечь имя и идентификатор, или для выполнения ваш домен объект преобразование даже может быть ...

следующих шагов:

  1. использовать асинхронную API
  2. получить Документ
  3. извлечь список детей и поток этих идентификаторов
  4. асинхронно получать каждый дочерний документ и поток их но держать их в первоначальном порядке
  5. собрать все в блок List<JsonDocument>
  6. до список готов и возвращает этот список.
+0

Большое спасибо. Это очень помогло. – user6479138

+0

А как насчет разбитого на страницы результата? Есть ли способ сделать это с помощью операций k/v? – user6479138

+0

Вы имеете в виду для ссылочных документов? Вы можете использовать skip и принимать rx-операторы после того, как from() в flatmap –