Получите безграничные возможности с новыми запросами Appwrite

Appwrite — это серверная часть как услуга с открытым исходным кодом, которая абстрагирует всю сложность, связанную с созданием современного приложения, предоставляя вам набор REST API для ваших основных потребностей серверной части. Appwrite обрабатывает аутентификацию и авторизацию пользователей, базы данных в реальном времени, облачные функции, веб-перехватчики и многое другое!

Что еще более удивительно, так это то, что недавно мы стали номером 1! 🥳 В долгожданной версии 1.0 представлены потрясающие функции, которые сделают разработку веб-приложений и приложений еще более УВЛЕКАТЕЛЬНОЙ. Одним из них является новый синтаксис запроса, который предоставляет множество возможностей, но сначала давайте разберемся, что он означает для query.

🔍 Что такое запрос?

База данных является важной частью любого приложения. Это место, где хранится вся информация, созданная пользователями. Хранение данных важно, но полезно только в том случае, если вы можете читать данные. В конце концов, кто будет использовать приложение, в котором можно создать профиль, но никогда не просматривать его? 🤔

Это так просто! Запросы — это процесс чтения данных вашего приложения. Запросы могут быть такими же простыми, как «Дайте мне все, что у вас есть», но также могут быть надежными с множеством условий, операций сортировки или разбивки на страницы.

Давайте посмотрим на запрос в действии! В этом примере я буду использовать SQL (язык структурированных запросов), который позволяет нам считывать данные из базы данных, написав человеческое предложение.

Давайте начнем с простого запроса, чтобы получить все JavaScript-фреймворки в мире:

SELECT * FROM frameworks;

Этот запрос может удовлетворить все наши потребности, но будет работать очень медленно, поскольку наша база данных начнет расти. Давайте улучшим запрос, отфильтровав результаты и получив только популярные фреймворки:

SELECT * FROM frameworks WHERE popularity > 0.9;

Мы по-прежнему можем получать тысячи результатов, но мы никогда не показываем это на веб-сайте, верно? Давайте получим только первые 10 результатов:

SELECT * FROM frameworks WHERE popularity > 0.9 LIMIT 10;

Наконец, давайте сначала покажем самые популярные фреймворки:

SELECT * FROM frameworks WHERE popularity > 0.9 ORDER BY popularity DESC LIMIT 10;

Мы только что создали базовый запрос! 💪 Давайте теперь воспользуемся этими знаниями и создадим несколько запросов, которые мы можем использовать для чтения данных из базы данных Appwrite.

🖋️ Синтаксис запроса Appwrite

Начнем с фильтрующих запросов. Эти запросы предназначены для уменьшения количества результатов путем проверки выполнения условия в отношении каждого документа. Appwrite поддерживает множество запросов с фильтрами, которые позволяют сравнивать слова, текст, число или логические значения. Ниже приведена таблица всех доступных фильтрующих запросов и пример того, как такой запрос может выглядеть в мире SQL, чтобы облегчить понимание:

Query.equal("role", "Developer")
    WHERE role = 'Developer'
Query.equal("role", [ "Developer", "Designer" ])
    WHERE role = 'Developer' OR role = 'Designer'
Query.notEqual("category", "Flutter")
    WHERE category != "Flutter"
Query.lessThan("age", 100)
    WHERE age < 100
Query.lessThanEqual("age", 100)
    WHERE age <= 100
Query.greaterThan("balance", 4.99)
    WHERE balance > 4.99
Query.greaterThanEqual("balance", 4.99)
    WHERE balance >= 4.99
Query.search("content", "phone number")
    WHERE MATCH(content) AGAINST('phone number' IN BOOLEAN MODE)

Далее вы можете воспользоваться преимуществами сортировки запросов, которые позволяют упорядочивать результаты запроса определенным образом. Вы можете увидеть эту функцию во всех интернет-магазинах, которые позволяют сортировать товары по популярности, цене или отзывам. В Appwrite доступны следующие запросы:

Query.orderAsc("price")
    ORDER BY price ASC
Query.orderDesc("$createdAt")
    ORDER BY createdAt DESC

И последнее, но не менее важное: вы можете писать запросы на разбиение на страницы. Существуют различные способы разбиения на страницы вашей базы данных, о которых вы можете узнать больше в нашей статье Разбиение на страницы базы данных. Короче говоря, мы могли бы выполнять разбиение на страницы со смещением, используя запросы limit и offset, или разбиение на страницы с помощью курсора, используя limit и cursor. Все это возможно в Appwrite с помощью следующих запросов:

Query.limit(10)
    LIMIT 10
Query.offset(30)
    OFFSET 30
Query.cursorAfter("documentId15")
    WHERE id > 15
Query.cursorBefore("documentId50")
    WHERE id < 50

🧰 Запрос любой службы записи приложений

Если вы использовали Appwrite раньше, вы могли заметить, что все вышеперечисленные функции уже доступны, просто в другом синтаксисе. Итак... Почему изменение?

✨ Согласованность ✨

Эти функции были доступны только в некоторых сервисах! 😦 Наша задача состояла в том, чтобы внедрить запросы во все методы списка (там, где это имеет смысл), но вам было бы трудно научиться этому, а нам — поддерживать. Благодаря синтаксису запросов Appwrite теперь предлагает согласованный интерфейс для запроса любого ресурса точно таким же образом. Давайте посмотрим на это в действии!

import { Client, Databases, Query } from 'appwrite';
const client = new Client();
client
    .setEndpoint('https://[HOSTNAME_OR_IP]/v1')
    .setProject('PROJECT_ID]');
const database = new Databases(client);
// Get products from eshop database that are published and cost below 50$. Ordered by price to get most expensive first on third page, getting 10 items per page
const productsList = await database.listDocuments('eshop', 'products', [
    Query.equal("published", true),
    Query.lessThan("price", 49.99),
    Query.limit(10),
    Query.offset(20),
    Query.orderDesc("price")
]);
// Get up to 50 disabled collections in eshop database
const collectionsList = await database.listCollections('eshop', [
    Query.equal("enabled", false),
    Query.limit(50)
]);
// Get database by name
const databasesList = await database.list([
    Query.equal("name", 'eshop'),
    Query.limit(1)
]);

Давайте посмотрим еще несколько примеров с разными сервисами 😇

const storage = new Storage(client);
// Get all JPEG or PNG files ordered by file size
const filesList = await storage.listFiles('productPhotos', [
    Query.equal("mimeType", [ "image/jpeg", "image/png" ]),
    Query.orderAsc("sizeActual")
]);
const functions = new Functions(client);
// Get failed executions that were triggered by http request and lasted at least 5 seconds
const executionsList = await functions.listExecutions('createOrder', [
    Query.equal("status", "failed"),
    Query.equal("trigger", "http"),
    Query.greaterThanEqual("time", 5) // in seconds
]);
const teams = new Teams(client);
// Get 5th biggest team that has at least 100 members
const teamsList = await teams.list([
    Query.greaterThan("total", 100),
    Query.orderDesc("total"),
    Query.limit(1),
    Query.offset(5)
]);
const users = new Users(client);
// Find all Johns that verified their email address
const usersList = await users.list([
    Query.equal("emailVerification", true),
    Query.search("name", "John")
]);

Как видите, возможности безграничны! 🤯 Более того, новый синтаксис открывает двери для новых захватывающих функций, таких как объединение, конкретный выбор, подзапросы и новые операторы. Мы продолжим работать над тем, чтобы сделать базу данных Appwrite более гибкой и приближенной к используемой скрытой базе данных, будь то MySQL, MariaDB или, в будущем, MongoDB.

👨‍🎓 Заключение

Новый синтаксис запросов Appwrite, представленный в версии 1.0, обеспечивает долгожданную согласованность во всех службах Appwrite. Это не только упрощает процесс изучения Appwrite, но и открывает новые возможности, позволяющие создавать еще более удивительные приложения!

📚 Узнать больше

Вы можете использовать следующие ресурсы, чтобы узнать больше и получить помощь: