Как получить объемные документы/мультиполучения на основе ключей в базе весенних данных

Я пытался получить объемные документы на основе списка идентификаторов. Но по какой-то причине я не вижу в CRUD Repo метода, который может дать мне эти данные. Мне удалось найти имя метода «FindAll (List)», но, похоже, это работает только для представления с именем «все», и я не хочу вводить представление для простого поиска (который в первую очередь должен быть функциональностью диванной базы).

Может кто-нибудь, пожалуйста, дайте мне знать, какие у меня есть варианты для достижения моей конечной цели, если я не хочу в конечном итоге использовать запросы Views или Nickel.

Кроме того, почему он не поддерживается базой данных spring. Это что-то не ожидаемое?


person Kanishka Jain    schedule 04.04.2017    source источник


Ответы (2)


Repository должен иметь возможность findAll() сохранять документы, которые ему поручено сохранить. Проблема в том, что в Couchbase вы можете сохранять все виды документов в одной корзине, поэтому репозиторию нужен способ изолировать только те документы, которые соответствуют его типу Entity.

Это делается с учетом требования представления для операций CRUD и для сгенерированных запросов N1QL путем добавления критерия в поле _class к предложению WHERE.

Когда вы предоставляете List ключей, репозиторий Couchbase просто повторно использует представление, которое вы должны были настроить, чтобы работало findAll(), что дает дополнительное преимущество, гарантируя, что ключи, не соответствующие правильной сущности (то есть не проиндексированные представлением), будут быть проигнорировано.

Тем не менее, я думаю, что в дорожной карте есть возможность удалить требование просмотра ... (Но это зависит от команды Couchbase. Возможно, поднимите вопрос, чтобы получить более точный ответ на этот вопрос).

Spring Data Kay и его поддержка реактивного программирования, скорее всего, также изменят ситуацию.

person Simon Baslé    schedule 05.04.2017

Согласно документации, с RxJava вы можете использовать эффективную пакетную обработку.

Пример кода

bucket.async()
        .query(N1qlQuery.simple("SELECT meta().id as id FROM bucket"))
        .doOnNext(res -> res.info().map(N1qlMetrics::elapsedTime).
         forEach(t -> System.out.println("time elapsed"+t)))
        .flatMap(AsyncN1qlQueryResult::rows)
        .flatMap(row -> 
        bucket.async().
        get(row.value().getString("id")))
        .map(JsonDocument::content).
        toList()
        .toBlocking()
        .single();

RxJava является асинхронным, сэкономит дополнительные циклы обработки и в итоге должен работать лучше!

person sandy    schedule 04.04.2017
comment
чтобы добавить к этому ответу, вы можете получить доступ к bucket через интерфейс CouchbaseTemplate, который сам доступен из интерфейса CouchbaseRepository, на всякий случай - person Simon Baslé; 05.04.2017