У реагирующих клиентов Couchbase гарантируется порядок строк в представлении запроса
Я использую Couchbase Java SDK 2.2.6 с сервером Couchbase 4.1.
Я запрашиваю свое мнение с помощью следующего кода
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;
}
В логах от fromJsonDocument
Метод Я вижу, что строки не всегда сортируются по ключу строки. Обычно они есть, но иногда нет.
Если я просто запускаю этот запрос в графическом интерфейсе couchbase браузера, я всегда получаю результаты в ожидаемом порядке. Это ошибка или ожидается, что результаты запроса представления не сортируются при запросе с асинхронным клиентом? Каково поведение у разных клиентов, а не Java?
1 ответ
Это связано с асинхронным характером вашего вызова в клиенте Java + тем фактом, что вы использовали includeDocs
,
Какие includeDocs
будет делать то, что он будет плести в вызове get
для каждого документа идентификатор, полученный из представления. Поэтому, когда вы смотрите на асинхронную последовательность AsyncViewRow
с помощью includeDocs вы фактически просматриваете композицию строки, возвращаемой представлением, и асинхронное извлечение всего документа.
Если поиск документа имеет небольшую задержку по сравнению с предыдущей строкой, он может изменить порядок передачи (строка + документ).
Но хорошие новости всем! E сть includeDocsOrdered
альтернатива в ViewQuery
принимает те же параметры, что и includeDocs
но будет гарантировать, что AsyncViewRow
прийти в том же порядке, возвращенном представлением.
Это сделано, жадно вызывая get
поиск, но затем буферизация тех, которые поступают не по порядку, чтобы поддерживать первоначальный порядок, не жертвуя при этом слишком высокой производительностью.
Это довольно специфично для клиента Java, с его использованием RxJava
, Я даже не уверен, что другие клиенты имеют представление о includeDocs
...