* 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! Увидимся там!