Как преобразовать запрос n1ql для использования с реактивным репозиторием Spring couchbase вместе с аннотацией @Query? - PullRequest
0 голосов
/ 18 апреля 2019

Я использую реактивный стек Spring вместе с реактивной couchbase Spring для создания API-интерфейсов, и мне нужна помощь в преобразовании запросов, которые я хочу использовать из ReactiveCouchbaseRepository.

подход для создания индекса в couchbase был взят из этого поста: https://forums.couchbase.com/t/indexing-array-of-strings/14977

CREATE INDEX idx_emaillist ON api (DISTINCT ARRAY k FOR k IN emails.emaillist END);

запрос, который я использую для поиска:

SELECT * FROM user AS u WHERE ANY k IN u.emails.emaillist SATISFIES k = "abc@email.com" END;

результат этого запроса:

[
  {
    "u": {
      "_class": "com.users.api.model.User",
      "name": "abc",
      "emails": {
        "emaillist": [
          "abc@email.com",
          ""xyz@email.com"
        ]
      }
    }
  }
]

Я хотел бы использовать тот же запрос из метода, объявленного в интерфейсе, расширяющем ReactiveCouchbaseRepository.

Я также попробовал подход, указанный в этом билете: Можем ли мы преобразовать N1QL в запрос shEL для использования в Spring

Этот подход работает отлично, но я хочу, чтобы Spring позаботился о коде котельной пластины, а также заметил, что вызовы блокируются, но я хотел бы иметь неблокирующие вызовы на couchbase.

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Если у вас нет каких-либо других свойств, связанных с электронной почтой, лучше сохранить его, как вы это сделали:

[
  {
    "u": {
      "_class": "com.users.api.model.User",
      "name": "abc",
      "emails": [
          "abc@email.com",
          ""xyz@email.com"
      ]
    }
  }
]

Обратите внимание, что вы также должны изменить свой индекс.

Вот несколько хороших ссылок о том, как создавать индексы для массивов: https://docs.couchbase.com/server/6.0/n1ql/n1ql-language-reference/indexing-arrays.html https://forums.couchbase.com/t/how-to-correctly-create-array-index/17349 https://blog.couchbase.com/making-the-most-of-your-arrays-with-array-indexing/

Вы можете распечатать запросы, которые генерируются данными пружины: https://blog.couchbase.com/how-to-log-queries-generated-by-spring-data/

и выполните запрос с ключевым словом «EXPLAIN», чтобы убедиться, что ваш запрос использует индекс. Если вы используете версию Enterprise, вы можете просто проверить планировщик запросов.

0 голосов
/ 24 апреля 2019

Я не смог найти ответ на свой вопрос, но после попытки еще нескольких опций обнаружил, что могу сделать это, изменив формат моего объекта JSON.

From:

[
  {
    "u": {
      "_class": "com.users.api.model.User",
      "name": "abc",
      "emails": {
        "emaillist": [
          "abc@email.com",
          ""xyz@email.com"
        ]
      }
    }
  }
]

TO this:

[
  {
    "u": {
      "_class": "com.users.api.model.User",
      "name": "abc",
      "emails": [
          "abc@email.com",
          ""xyz@email.com"
      ]
    }
  }
]

Теперь метод в реактивном репозитории couchbase изменен на:

    @Query("#{#n1ql.selectEntity} where #{#n1ql.filter} AND ARRAY_CONTAINS(emails, $1)")
    Flux<User> findByIdEmail(String email);

Далее я проверил журналы, чтобы увидеть, является ли поток потоком ввода-вывода или niothread

DEBUG 19228 --- [reactor-http-nio-3] s.d.c.r.q.ReactiveAbstractN1qlBasedQuery : Executing N1QL query: {"args":["ABC"],"statement":"SELECT META(`user`).id AS _ID, META(`user`).cas AS _CAS, `user`.* FROM `user` where `_class` = \"com.users.api.model.User\" AND ARRAY_CONTAINS(emails, $1)","scan_consistency":"statement_plus"}

Я надеюсь, что это решение поможет другим, и не уверен, почему я хотел создать структуру с Object, а затем с массивом.Поправь меня, если я ошибаюсь.

...