Статьи

N1QL от Couchbase: это делает центы!

Этот пост был изначально написан Робин Джонсон

* Ba Dum Tschhh *… Видите, что я там делал? Делает центы? Возьми? Ха-ха.

Итак… N1QL (произносится никель)… новый язык запросов следующего поколения Couchbase; что это такое? Что ж, это довольно гениальный, читаемый / записываемый, расширяемый язык, разработанный для специальных и оперативных запросов в Couchbase. Для тех, кто уже знаком с запросами в Couchbase, эта реклама, вероятно, будет иметь смысл для вас. Если нет — ну, вероятно, нет, поэтому позвольте мне прояснить это немного подробнее.

Но прежде чем я сделаю это, я должен сообщить вам, что эта статья в блоге не лучшее место для вас, если вы хотите погрузиться и начать изучать N1QL. Это взгляд на N1QL с точки зрения разработчика, включая то, почему я так взволнован этим, и функции, на которые я с гордостью могу указать. Если вы хотите начать изучать N1QL, нажмите здесь . Или в качестве альтернативы, пойти и попробовать онлайн-учебник . В любом случае, вернемся к разъяснению того, что я имею в виду, когда говорю N1QL…

«N1QL похож на стандартный язык SQL для реляционных баз данных, но также включает дополнительные функции; которые подходят для баз данных, ориентированных на документы ». N1QL был разработан как интуитивно понятный язык запросов для использования в базах данных, структурированных вокруг документов вместо таблиц. Чтобы найти и использовать информацию в ориентированной на документы базе данных, вам необходима правильная логика и выражения для навигации по документам и структурам документов. N1QL предоставляет понятный и понятный уровень абстракции для запроса и извлечения информации из вашей базы данных документов.

Прежде чем мы перейдем к N1QL, давайте быстро поговорим о моделировании документов в Couchbase. Как вы, наверное, знаете; в Couchbase мы моделируем наши документы в основном в формате JSON. Мы все знакомы с JSON, поэтому я не буду вдаваться в подробности, но одну вещь, которую мы должны иметь в виду, это то, что: наши документы JSON могут иметь сложные вложенные структуры данных, вложенные массивы и объекты, которые обычно сделать запрос проблемы. В отличие от SQL, N1QL обладает способностью перемещаться по вложенным данным, поскольку поддерживает концепцию путей.   Это очень круто. Мы можем использовать путииспользуя синтаксис с точечной нотацией, чтобы дать нам логическое расположение атрибута в документе. Например; если бы у нас был сайт электронной коммерции с документами, содержащими заказы клиентов, мы могли бы заглянуть внутрь этих документов на N-й вложенный уровень для атрибутов. Так что, если мы хотим найти улицу доставки клиента:

orders.shipTo.street

Очень круто, правда? Это также один из главных отличий, отличающих этот язык запросов от SQL.

Как и большинство из вас, читающих это, я тоже имею опыт работы с SQL. Я полагаю, я могу с уверенностью предположить, что 99% из вас тоже, верно? Если вы это сделаете, вы заметите, что N1QL не только выглядит знакомо, но и кажется знакомым, что дает нам мгновенное чувство ценности, потому что мы почти знаем синтаксис, не изучая ничего нового.

Теперь давайте запустим несколько запросов и посмотрим, что произойдет! Для этих запросов я буду запускать их с образцом «учебного» набора данных, как показано в интерактивном учебном руководстве / учебном руководстве по предварительному просмотру. Во-первых, давайте посмотрим, как формируются запросы:

Базовый запрос состоит из трех частей:

  • SELECT — части документа для возврата
  • FROM корзина данных или хранилище данных для работы с
  • ГДЕ — Условия, которым должен соответствовать документ

Запрос действительно требует только предложения SELECT. Если мы запустим предложение SELECT с подстановочным знаком *; мы будем выбирать все части документа. Так что, если мы запустим следующий запрос:

SELECT *
  FROM tutorial
    WHERE fname = 'Dave'

Мы вернем данные, как показано здесь …

Принимая во внимание то, что мы узнали ранее о вложенных структурах данных, если мы изменили этот подстановочный знак * для использования одного из вложенных атрибутов документа ‘ children’ вместо подстановочного знака *, мы можем вернуть из нашего запроса только фрагмент документа.

Итак, запустив:

SELECT children
  FROM tutorial
    WHERE fname = 'Dave'

Мы вернемся:

{
  "resultset": [
    {
      "children": [
        {
          "age": 17,
          "fname": "Aiden",
          "gender": "m"
        },
        {
          "age": 2,
          "fname": "Bill",
          "gender": "m"
        }
      ]
    }
  ]
}

Теперь запомните, у нас в Couchbase НЕТ ФИКСИРОВАННОЙ СХЕМЫ, поэтому мы не теряем удивительную гибкость, которую мы любим в Couchbase. Теперь, когда я говорю, что у нас нет фиксированной схемы, я имею в виду, что Couchbase не применяет схему; но наши документы, конечно, имеют структуру, учитывая, что они являются документами JSON.

N1QL-запросы работают против документов, а не строк или столбцов, в отличие от реляционных баз данных. Поскольку документы могут иметь вложенные атрибуты и встроенные массивы, необходимо несколько дополнительных операторов  . В N1QL у нас есть «.» оператор, который используется для ссылки на дочерние элементы , и оператор ‘[]’, который используется для ссылки на элемент в массиве. На самом деле мы можем использовать комбинацию операторов для доступа к данным на любой глубине в документе.

Например; если мы запустили запрос:

SELECT children[0].fname AS cname
    FROM tutorial
       WHERE fname='Dave'

Здесь мы выбираем имя первого ребенка и расшифровываем его псевдоним «cname». Атрибуты из дочерних документов можно явно указать с помощью предложения AS .

Результат, который мы возвращаем из этого запроса:

{
  "resultset": [
    {
      "fname": "Aiden"
    }
  ]
}

Базы данных документов, такие как Couchbase, часто хранят метаданные о документе вне документа. В N1QL мы используем функцию «META ()» для доступа к метаданным для каждого документа в учебной базе данных примера. Из этого запроса единственными полями, которые мы собираемся вернуть, являются метаданные документа. Запрос выглядит следующим образом:

SELECT META() AS meta
    FROM tutorial

И результаты можно увидеть здесь …

В предыдущих запросах мы использовали предложение WHERE для сопоставления с одним документом, но мы могли также использовать другие операторы сравнения для сопоставления нескольких документов. Скажем, например, мы хотим найти в нашей базе данных всех, кто старше 30 лет; мы можем выполнить следующий запрос:

SELECT fname, age
    FROM tutorial
        WHERE age > 30

Который вернет этот набор результатов …

Поддерживаются все стандартные операторы сравнения, такие как (>,> =, <, <=, = и! =). Все эти сравнения также учитывают тип значения, поэтому оценка> 8 вернет документы, содержащие числовую оценку, превышающую 8.

На мой взгляд, одна из самых крутых возможностей — это способ сопоставления с образцом с помощью оператора «LIKE» в предложении WHERE. Скажем, например, нам нужно найти в нашей базе данных всех, кто имеет адрес электронной почты с yahoo.com. Мы можем выполнить запрос, используя оператор « LIKE», чтобы сопоставить адреса электронной почты. В этом запросе мы будем использовать ‘%’ в качестве символа подстановки, который будет соответствовать 0 или более символам. Мы также могли бы использовать ‘_’, если нам нужно было точно соответствовать 1 символу. Итак, запрос, чтобы найти в нашей базе данных всех, кто использует адрес электронной почты yahoo.com:

SELECT fname, email
    FROM tutorial
        WHERE email LIKE '%@yahoo.com'

Как вы можете видеть, мы включили оператор LIKE в предложение WHERE, чтобы соответствовать адресам электронной почты. Результирующий набор, который вернет запрос, выглядит следующим образом …

{
  "resultset": [
    {
      "email": "[email protected]",
      "fname": "Harry"
    }
    {
      "email": "[email protected]",
      "fname": "Dave"
    }
  ]
}

Лично я считаю, что это одна из самых удобных функций N1QL! Но, скажем, мы хотим сделать противоположное тому, что мы только что сделали, и мы хотим перечислить всех людей, которые не соответствуют адресу электронной почты yahoo.com. Еще одна злая функция — это оператор NOT LIKE, который мы можем использовать для поиска документов, которые не соответствуют шаблону.

Конечно, мы можем объединить несколько условий, используя оператор « И» . Например, если мы хотим вернуть людей, у которых есть хотя бы один ребенок и адрес электронной почты gmail, мы запустим:

SELECT fname, email, children
    FROM tutorial
        WHERE LENGTH(children) > 0 AND email LIKE '%@gmail.com'

Мы также могли бы заменить этот оператор « И» на оператор « ИЛИ», чтобы соответствовать в нескольких условиях.

Сходство с SQL-запросами продолжается, когда мы переходим к упорядочению и разбивке на страницы результатов нашего запроса. N1QL включает знакомое предложение «ORDER BY» , чтобы позволить нам упорядочить наш набор результатов запроса. Запросы могут дать много результатов, если у нас очень большой набор данных, поэтому мы можем разбить наши результаты на страницы. Хорошие новости! Мы тоже можем это сделать! Запрос, включающий предложение ORDER BY и пагинацию LIMIT, может выглядеть следующим образом:

SELECT fname, age
    FROM tutorial
        ORDER BY age
            LIMIT 2

Мы можем создавать агрегаты данных в нашем наборе данных, используя такие команды, как функция «COUNT ()» ; который сказал бы нам, сколько документов в нашем ведре. Мы также можем сгруппировать наши данные, используя знакомое предложение GROUP BY . Если мы хотим отфильтровать набор результатов, по которым возвращаются группы, мы можем использовать предложение « HAVING» , где мы использовали бы предложение «WHERE» для фильтрации документов.

Если мы хотим вернуть только группы, которые имеют более одного члена, мы можем написать запрос, подобный следующему:

SELECT relation, COUNT(*) AS count
    FROM tutorial
        GROUP BY relation
            HAVING COUNT(*) > 1

Еще одна особенность, которую я хотел бы упомянуть, — это то, что мы можем делать соединения внутри документа (также называемые отменой или выравниванием).   Это означает, что мы можем взять содержимое вложенных массивов и соединить их с родительским объектом. Так, например; Если мы хотим присоединиться к Дейву с каждым из его 2 детей, мы можем написать запрос, подобный следующему:

SELECT *
    FROM tutorial AS contact
        OVER child IN contact.children
            WHERE contact.fname = 'Dave'

Этот запрос вернет набор результатов, как вы можете видеть здесь …

Ну, это в значительной степени оборачивает возможности N1QL, которые я действительно хотел показать. Лично я считаю, что это один из самых интересных проектов Couchbase, мне очень нравится синтаксис N1QL и я считаю, что сам проект фантастический.

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

Если вы хотите пройти 15-минутное онлайн-руководство для более глубокого погружения, вы можете сделать это здесь.

И если вам нужно более подробное руководство по предварительному просмотру N1QL для разработчиков, вы можете просмотреть официальные документы, нажав здесь

Я надеюсь, что этот блог вдохновил вас начать использовать N1QL, так как он невероятно увлекательный и очень крутой образец технологии. Если у вас есть какие-либо вопросы о ваших приключениях в мире N1QL, я призываю вас задать их на нашем портале сообщества N1QL и получить ответы от профессионалов!

Идите и погрузитесь в мир N1QL! Увидимся там!