diff --git a/README.md b/README.md index 1c7e93b..2368171 100644 --- a/README.md +++ b/README.md @@ -1,574 +1,8 @@ -# MongoDB Aggregation Cheat Sheet +# Repositório Cheat Sheet da Trybe -# Sumário +Repositório de *cheat sheets* para consultas rápidas. -- [MongoDB Aggregation Cheat Sheet](#mongodb-aggregation-cheat-sheet) -- [Sumário](#sumário) -- [Operadores](#operadores) - - [Operadores Aggregation](#operadores-aggregation) - - [$match](#match) - - [$limit](#limit) - - [$group](#group) - - [$project](#project) - - [$unwind](#unwind) - - [$lookup](#lookup) - - [$lookup (let/pipeline)](#lookup-letpipeline) - - [$addFields](#addfields) - - [Operadores Aritméticos](#operadores-aritméticos) - - [$add](#add) - - [$subtract](#subtract) - - [$ceil](#ceil) - - [$floor](#floor) - - [$abs](#abs) - - [$multiply](#multiply) - - [$divide](#divide) - ---- - -# Operadores - -## Operadores Aggregation - -### $match - -**Template** - -``` -db.collection.aggregate([ - { $match: { } }, -]); -``` - -**Exemplo** - -```javascript -db.workers.aggregate([ - { $match: { workerName: "Tiago" } }, -]); -``` - -[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/match/) - -[Voltar para Sumário](#sumário) - ---- - -### $limit - -**Template** - -``` -db.collection.aggregate([ - { $limit: }, -]); -``` - -**Exemplo** - -```javascript -db.products.aggregate([ - { $match: { laptop: 'Dell' } }, - { $limit: 5 }, -]); -``` - -[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/limit/) - -[Voltar para Sumário](#sumário) - ---- - -### $group - -**Template** - -``` -db.collection.aggregate([ - { - $group: { - _id: , - : { : }, - ... - : { : }, - }, - }, -]); -``` - -**Exemplo** - -```javascript -db.products.aggregate([ - { - $group : { - _id : "$laptopId", - count: { $sum: 1 }, - }, - }, -]); -``` - -[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/group/) - -[Voltar para Sumário](#sumário) - ---- - -### $project - -**Template** - -``` -db.collection.aggregate([ - { - project: { - - }, - }, -]); -``` - -**Exemplo** - -```javascript -db.products.aggregate([ - { - $project: { - _id: 0, // ou false - productName: "$laptop", - quantity: 1, // ou true - profit: { - $subtract: ["$sale_price", "$cost_price"] - }, - }, - }, -]); -``` - -[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/project) - -[Voltar para Sumário](#sumário) - ---- - -### $unwind - -**Template** - -``` -db.collection.aggregate([ - { $unwind: }, -]); -``` - -**Exemplo** - -```javascript -db.streamings.aggregate([ - { $unwind: "$netflix_plans" }, -]); -``` - -[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/) - -[Voltar para Sumário](#sumário) - ---- - -### $lookup - -**Template** - -``` -db.collection.aggregate([ - { - $lookup: { - from: , - localField: , - foreignField: - }, - }, -]); -``` - -**Exemplo** - -```javascript -db.orders.aggregate([ - { - $lookup: { - from: "inventory", - localField: "item", - foreignField: "sku", - as: "inventory_docs" - }, - }, -]); -``` - -[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/) - -[Voltar para Sumário](#sumário) - ---- - -### $lookup (let/pipeline) - -**Template** - -``` -db.collection.aggregate([ - { - $lookup: - { - from: , - let: { : , …, : }, - pipeline: [ ], - as: - } -} -]); -``` - -**Exemplo** - -```javascript -db.orders.aggregate([ - { - $lookup: - { - from: "warehouses", - let: { order_item: "$item", order_qty: "$ordered" }, - pipeline: [ - { $match: - { $expr: - { $and: - [ - { $eq: [ "$stock_item", "$$order_item" ] }, - { $gte: [ "$instock", "$$order_qty" ] } - ] - } - } - }, - { $project: { stock_item: 0, _id: 0 } } - ], - as: "stockdata" - } - } -]) -``` - -[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/) - -[Voltar para Sumário](#sumário) - ---- - -### $addFields - -**Template** - -``` -db.collection.aggregate([ - { - $addFields: { - : , - : , - ... - }, - }, -]); -``` - -**Exemplo** - -```javascript -db.school.aggregate([ - { - $addFields: { - totalHomework: { $sum: "$homework" } , - totalQuiz: { $sum: "$quiz" } - }, - }, - { - $addFields: { - totalScore: { - $add: [ "$totalHomework", "$totalQuiz", "$extraCredit" ] - }, - }, - }, -]); -``` - -[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/addFields/) - -[Voltar para Sumário](#sumário) - -## Operadores Aritméticos - -### $add - -**Template** - -``` -db.collection.aggregate([ - { - $project: { - : { - $add: [ , , ... ] - }, - }, - }, -]); -``` - -**Exemplo** - -```javascript -db.products.aggregate([ - { - $project: { - item: 1, - total: { - $add: ["$price", "$fee"] - }, - }, - }, -]); -``` - -[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/add/) - -[Voltar para Sumário](#sumário) - ---- - -### $subtract - -**Template** - -``` -db.collection.aggregate([ - { - $project: { - : { - $subtract: [ - , - - ] - }, - }, - }, -]); -``` - -**Exemplo** - -```javascript -db.products.aggregate([ - { - $project: { - item: 1, - total: { - $subtract: [ - { $add: ["$price", "$fee"] }, - "$discount" - ] - }, - }, - }, -]); -``` - -[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/subtract/) - -[Voltar para Sumário](#sumário) - ---- - -### $ceil - -**Template** - -``` -db.collection.aggregate([ - { - $project: { - roundedNumber: { - $ceil: , - }, - }, - }, -]); -``` - -**Exemplo** - -```javascript -db.movies.aggregate([ - { - $project: { - value: 1, - ceilingValue: { - $ceil: "$rating", - }, - }, - }, -]); -``` - -[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/ceil/) - -[Voltar para Sumário](#sumário) - ---- - -### $floor - -**Template** - -``` -db.collection.aggregate([ - { - $project: { - value: 1, - roundedNumber: { - $floor: , - }, - }, - }, -]); -``` - -**Exemplo** - -```javascript -db.movies.aggregate([ - { - $project: { - value: 1, - floorValue: { - $floor: "$value", - }, - }, - }, -]); -``` - -[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/floor/) - -[Voltar para Sumário](#sumário) - ---- - -### $abs - -**Template** - -``` -db.collection.aggregate([ - { - project: { - : { - abs: , - }, - }, - }, -]); -``` - -**Exemplo** - -```javascript -db.operations.aggregate([ - { - project: { - delta: { - abs: { $subtract: ["$start", "$end"] }, - }, - }, - }, -]); -``` -[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/abs/) - -[Voltar para Sumário](#sumário) - ---- - -### $multiply - -**Template** - -``` -db.collection.aggregate([ - { - project: { - : { - $multiply: [ , , ... ] - }, - }, - }, -]); -``` - -**Exemplo** - -```javascript -db.operations.aggregate([ - { - project: { - date: 1, - item: 1, - total: { - $multiply: [ - "$price", - "$quantity" - ] - }, - }, - }, -]); -``` -[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/multiply/) - -[Voltar para Sumário](#sumário) - ---- - -### $divide - -**Template** - -``` -db.collection.aggregate([ - { - project: { - : { - $divide: [ , ] - }, - }, - }, -]); -``` - -**Exemplo** - -```javascript -db.employees.aggregate([ - { - project: { - name: 1, - workdays: { - $divide: ["$hours", 8] - }, - }, - }, -]); -``` -[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/divide/) - -[Voltar para Sumário](#sumário) - ---- +- [Backend]() + - [MongoDB - Aggregration]() + - [Sequelize - Queries]() +- [Frontend]() diff --git a/backend/mongodb/mongodb_aggregation/README.md b/backend/mongodb/mongodb_aggregation/README.md new file mode 100644 index 0000000..1c7e93b --- /dev/null +++ b/backend/mongodb/mongodb_aggregation/README.md @@ -0,0 +1,574 @@ +# MongoDB Aggregation Cheat Sheet + +# Sumário + +- [MongoDB Aggregation Cheat Sheet](#mongodb-aggregation-cheat-sheet) +- [Sumário](#sumário) +- [Operadores](#operadores) + - [Operadores Aggregation](#operadores-aggregation) + - [$match](#match) + - [$limit](#limit) + - [$group](#group) + - [$project](#project) + - [$unwind](#unwind) + - [$lookup](#lookup) + - [$lookup (let/pipeline)](#lookup-letpipeline) + - [$addFields](#addfields) + - [Operadores Aritméticos](#operadores-aritméticos) + - [$add](#add) + - [$subtract](#subtract) + - [$ceil](#ceil) + - [$floor](#floor) + - [$abs](#abs) + - [$multiply](#multiply) + - [$divide](#divide) + +--- + +# Operadores + +## Operadores Aggregation + +### $match + +**Template** + +``` +db.collection.aggregate([ + { $match: { } }, +]); +``` + +**Exemplo** + +```javascript +db.workers.aggregate([ + { $match: { workerName: "Tiago" } }, +]); +``` + +[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/match/) + +[Voltar para Sumário](#sumário) + +--- + +### $limit + +**Template** + +``` +db.collection.aggregate([ + { $limit: }, +]); +``` + +**Exemplo** + +```javascript +db.products.aggregate([ + { $match: { laptop: 'Dell' } }, + { $limit: 5 }, +]); +``` + +[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/limit/) + +[Voltar para Sumário](#sumário) + +--- + +### $group + +**Template** + +``` +db.collection.aggregate([ + { + $group: { + _id: , + : { : }, + ... + : { : }, + }, + }, +]); +``` + +**Exemplo** + +```javascript +db.products.aggregate([ + { + $group : { + _id : "$laptopId", + count: { $sum: 1 }, + }, + }, +]); +``` + +[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/group/) + +[Voltar para Sumário](#sumário) + +--- + +### $project + +**Template** + +``` +db.collection.aggregate([ + { + project: { + + }, + }, +]); +``` + +**Exemplo** + +```javascript +db.products.aggregate([ + { + $project: { + _id: 0, // ou false + productName: "$laptop", + quantity: 1, // ou true + profit: { + $subtract: ["$sale_price", "$cost_price"] + }, + }, + }, +]); +``` + +[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/project) + +[Voltar para Sumário](#sumário) + +--- + +### $unwind + +**Template** + +``` +db.collection.aggregate([ + { $unwind: }, +]); +``` + +**Exemplo** + +```javascript +db.streamings.aggregate([ + { $unwind: "$netflix_plans" }, +]); +``` + +[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/) + +[Voltar para Sumário](#sumário) + +--- + +### $lookup + +**Template** + +``` +db.collection.aggregate([ + { + $lookup: { + from: , + localField: , + foreignField: + }, + }, +]); +``` + +**Exemplo** + +```javascript +db.orders.aggregate([ + { + $lookup: { + from: "inventory", + localField: "item", + foreignField: "sku", + as: "inventory_docs" + }, + }, +]); +``` + +[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/) + +[Voltar para Sumário](#sumário) + +--- + +### $lookup (let/pipeline) + +**Template** + +``` +db.collection.aggregate([ + { + $lookup: + { + from: , + let: { : , …, : }, + pipeline: [ ], + as: + } +} +]); +``` + +**Exemplo** + +```javascript +db.orders.aggregate([ + { + $lookup: + { + from: "warehouses", + let: { order_item: "$item", order_qty: "$ordered" }, + pipeline: [ + { $match: + { $expr: + { $and: + [ + { $eq: [ "$stock_item", "$$order_item" ] }, + { $gte: [ "$instock", "$$order_qty" ] } + ] + } + } + }, + { $project: { stock_item: 0, _id: 0 } } + ], + as: "stockdata" + } + } +]) +``` + +[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/) + +[Voltar para Sumário](#sumário) + +--- + +### $addFields + +**Template** + +``` +db.collection.aggregate([ + { + $addFields: { + : , + : , + ... + }, + }, +]); +``` + +**Exemplo** + +```javascript +db.school.aggregate([ + { + $addFields: { + totalHomework: { $sum: "$homework" } , + totalQuiz: { $sum: "$quiz" } + }, + }, + { + $addFields: { + totalScore: { + $add: [ "$totalHomework", "$totalQuiz", "$extraCredit" ] + }, + }, + }, +]); +``` + +[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/addFields/) + +[Voltar para Sumário](#sumário) + +## Operadores Aritméticos + +### $add + +**Template** + +``` +db.collection.aggregate([ + { + $project: { + : { + $add: [ , , ... ] + }, + }, + }, +]); +``` + +**Exemplo** + +```javascript +db.products.aggregate([ + { + $project: { + item: 1, + total: { + $add: ["$price", "$fee"] + }, + }, + }, +]); +``` + +[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/add/) + +[Voltar para Sumário](#sumário) + +--- + +### $subtract + +**Template** + +``` +db.collection.aggregate([ + { + $project: { + : { + $subtract: [ + , + + ] + }, + }, + }, +]); +``` + +**Exemplo** + +```javascript +db.products.aggregate([ + { + $project: { + item: 1, + total: { + $subtract: [ + { $add: ["$price", "$fee"] }, + "$discount" + ] + }, + }, + }, +]); +``` + +[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/subtract/) + +[Voltar para Sumário](#sumário) + +--- + +### $ceil + +**Template** + +``` +db.collection.aggregate([ + { + $project: { + roundedNumber: { + $ceil: , + }, + }, + }, +]); +``` + +**Exemplo** + +```javascript +db.movies.aggregate([ + { + $project: { + value: 1, + ceilingValue: { + $ceil: "$rating", + }, + }, + }, +]); +``` + +[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/ceil/) + +[Voltar para Sumário](#sumário) + +--- + +### $floor + +**Template** + +``` +db.collection.aggregate([ + { + $project: { + value: 1, + roundedNumber: { + $floor: , + }, + }, + }, +]); +``` + +**Exemplo** + +```javascript +db.movies.aggregate([ + { + $project: { + value: 1, + floorValue: { + $floor: "$value", + }, + }, + }, +]); +``` + +[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/floor/) + +[Voltar para Sumário](#sumário) + +--- + +### $abs + +**Template** + +``` +db.collection.aggregate([ + { + project: { + : { + abs: , + }, + }, + }, +]); +``` + +**Exemplo** + +```javascript +db.operations.aggregate([ + { + project: { + delta: { + abs: { $subtract: ["$start", "$end"] }, + }, + }, + }, +]); +``` +[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/abs/) + +[Voltar para Sumário](#sumário) + +--- + +### $multiply + +**Template** + +``` +db.collection.aggregate([ + { + project: { + : { + $multiply: [ , , ... ] + }, + }, + }, +]); +``` + +**Exemplo** + +```javascript +db.operations.aggregate([ + { + project: { + date: 1, + item: 1, + total: { + $multiply: [ + "$price", + "$quantity" + ] + }, + }, + }, +]); +``` +[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/multiply/) + +[Voltar para Sumário](#sumário) + +--- + +### $divide + +**Template** + +``` +db.collection.aggregate([ + { + project: { + : { + $divide: [ , ] + }, + }, + }, +]); +``` + +**Exemplo** + +```javascript +db.employees.aggregate([ + { + project: { + name: 1, + workdays: { + $divide: ["$hours", 8] + }, + }, + }, +]); +``` +[Documentação](https://docs.mongodb.com/manual/reference/operator/aggregation/divide/) + +[Voltar para Sumário](#sumário) + +--- diff --git a/backend/sequelize/implementation/README.md b/backend/sequelize/implementation/README.md new file mode 100644 index 0000000..e69de29 diff --git a/backend/sequelize/queries/README .md b/backend/sequelize/queries/README .md new file mode 100644 index 0000000..b3a66da --- /dev/null +++ b/backend/sequelize/queries/README .md @@ -0,0 +1,798 @@ +# Sequelize Queries Cheat Sheet + +# Sumário + +- [Sequelize Queries Cheat Sheet](#sequelize-queries-cheat-sheet) +- [Sumário](#sumário) +- [Operadores](#operadores) +- [Métodos](#métodos) + - [create](#create) + - [update](#update) + - [destroy](#destroy) + - [findAll](#findall) + - [SELECT simples](#select-simples) + - [SELECT específico](#select-específico) + - [Sem alias](#sem-alias) + - [Com alias](#com-alias) + - [SELECT Agregações](#select-agregações) + - [SELECT com WHERE](#select-com-where) + - [GROUP BY](#group-by) + - [LIMIT / OFFSET](#limit--offset) + - [findByPK](#findbypk) + - [findOne](#findone) + - [findOrCreate](#findorcreate) + - [findAndCountAll](#findandcountall) + - [count](#count) + - [max](#max) + - [min](#min) + - [sum](#sum) + +--- + +# Operadores + +```javascript +const { Op } = require("sequelize"); +await Post.findAll({ + where: { + [Op.and]: [{ a: 5 }, { b: 6 }], // (a = 5) AND (b = 6) + [Op.or]: [{ a: 5 }, { b: 6 }], // (a = 5) OR (b = 6) + someAttribute: { + // Basics + [Op.eq]: 3, // = 3 + [Op.ne]: 20, // != 20 + [Op.is]: null, // IS NULL + [Op.not]: true, // IS NOT TRUE + [Op.or]: [5, 6], // (someAttribute = 5) OR (someAttribute = 6) + + // Using dialect specific column identifiers (PG in the following example): + [Op.col]: 'user.organization_id', // = "user"."organization_id" + + // Number comparisons + [Op.gt]: 6, // > 6 + [Op.gte]: 6, // >= 6 + [Op.lt]: 10, // < 10 + [Op.lte]: 10, // <= 10 + [Op.between]: [6, 10], // BETWEEN 6 AND 10 + [Op.notBetween]: [11, 15], // NOT BETWEEN 11 AND 15 + + // Other operators + + [Op.all]: sequelize.literal('SELECT 1'), // > ALL (SELECT 1) + + [Op.in]: [1, 2], // IN [1, 2] + [Op.notIn]: [1, 2], // NOT IN [1, 2] + + [Op.like]: '%hat', // LIKE '%hat' + [Op.notLike]: '%hat', // NOT LIKE '%hat' + [Op.startsWith]: 'hat', // LIKE 'hat%' + [Op.endsWith]: 'hat', // LIKE '%hat' + [Op.substring]: 'hat', // LIKE '%hat%' + [Op.iLike]: '%hat', // ILIKE '%hat' (case insensitive) (PG only) + [Op.notILike]: '%hat', // NOT ILIKE '%hat' (PG only) + [Op.regexp]: '^[h|a|t]', // REGEXP/~ '^[h|a|t]' (MySQL/PG only) + [Op.notRegexp]: '^[h|a|t]', // NOT REGEXP/!~ '^[h|a|t]' (MySQL/PG only) + [Op.iRegexp]: '^[h|a|t]', // ~* '^[h|a|t]' (PG only) + [Op.notIRegexp]: '^[h|a|t]', // !~* '^[h|a|t]' (PG only) + + [Op.any]: [2, 3], // ANY ARRAY[2, 3]::INTEGER (PG only) + } + } +}); +``` + +# Métodos + +## create + +**Template** + +```javascript +await Model.create({ + : , + ..., + : , +}); +``` + +**Exemplo** + +```javascript +await User.create({ + fullName: "Jane Doe", + email: "jane.doe@gmail.com", +}); +``` + +**Query MySQL Equivalente** + +```sql +INSERT INTO Users('fullName', 'email') +VALUES ('Jane Doe', 'jane.doe@gmail.com'); +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-basics.html#simple-insert-queries) + +[Voltar para Sumário](#sumário) + +--- + +## update + +**Template** + +```javascript +await Model.update( + { + : , + ..., + : + }, + { + where: { }, + }, +); +``` + +**Exemplo** + +```javascript +await User.update( + { lastName: "Doe" }, + { + where: { lastName: null }, + }, +); +``` + +**Query MySQL Equivalente** + +```sql +UPDATE user +SET lastName = 'Doe' +WHERE lastName = 'null'; +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-basics.html#simple-update-queries) + +[Voltar para Sumário](#sumário) + +--- + +## destroy + +**Template** + +```javascript +await Model.destroy({ + where: { + : , + }, +}); +``` + +**Exemplo** + +```javascript +await User.destroy({ + where: { + firstName: "Jane", + }, +}); +``` + +**Query MySQL Equivalente** + +```sql +DELETE FROM User +WHERE firstname = 'Jane'; +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-basics.html#simple-delete-queries) + +[Voltar para Sumário](#sumário) + +--- + +## findAll + +### SELECT simples + +**Template** + +```javascript +await Model.findAll(); +``` + +**Exemplo** + +```javascript +await User.findAll(); +``` + +**Query MySQL Equivalente** + +```sql +SELECT * FROM User; +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-basics.html#simple-select-queries) + +[Voltar para Sumário](#sumário) + +--- + +### SELECT específico + +#### Sem alias + +**Template** + +```javascript +await Model.findAll({ + attributes: [ , ], +}); +``` + +**Exemplo** + +```javascript +await Products.findAll({ + attributes: [ 'price', 'stock' ], +}); +``` + +**Query MySQL Equivalente** + +```sql +SELECT price, stock FROM Products; +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-basics.html#specifying-attributes-for-select-queries) + +[Voltar para Sumário](#sumário) + +--- + +#### Com alias + +**Template** + +```javascript +await Model.findAll({ + attributes: [ , [ , ], ..., ] +}); +``` + +**Exemplo** + +```javascript +await Products.findAll({ + attributes: ['price', ['product_name', 'name'], 'stock'] +}); +``` + +**Query MySQL Equivalente** + +```sql +SELECT price, product_name AS name, stock FROM Products; +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-basics.html#specifying-attributes-for-select-queries) + +[Voltar para Sumário](#sumário) + +--- + +### SELECT Agregações + +**Template** + +```javascript +await Model.findAll({ + attributes: [ + , + [ sequelize.fn(, sequelize.col()), ], + ..., + , + ], +}); +``` + +**Exemplo** + +```javascript +await Products.findAll({ + attributes: [ + 'foo', + [sequelize.fn('COUNT', sequelize.col('hats')), 'n_hats'], + 'bar' + ] +}); +``` + +**Query MySQL Equivalente** + +```sql +SELECT foo, COUNT(hats) AS n_hats, bar FROM Products; +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-basics.html#specifying-attributes-for-select-queries) + +[Voltar para Sumário](#sumário) + +--- + +### SELECT com WHERE + +**Template** + +```javascript +await Model.findAll({ + where: { + : , + ..., + : , + }, +}); +``` + +**Exemplo** + +```javascript +await Post.findAll({ + where: { + authorId: 2, + status: 'active' + } +}); +``` + +**Query MySQL Equivalente** + +```sql +SELECT * FROM post WHERE authorId = 2 AND status = 'active'; +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-basics.html#applying-where-clauses) + +[Voltar para Sumário](#sumário) + +--- + +### GROUP BY + +**Template** + +```javascript +await Model.findAll({ group: }); +``` + +**Exemplo** + +```javascript +await Project.findAll({ group: 'name' }); +``` + +**Query MySQL Equivalente** + +```sql +GROUP BY name; +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-basics.html#grouping) + +[Voltar para Sumário](#sumário) + +--- + +### LIMIT / OFFSET + +**Template** + +```javascript +// limit +await Model.findAll({ limit: }); +``` + +```javascript +// offset +await Model.findAll({ offset: }); +``` + +```javascript +// limit & offset +await Model.findAll({ offset: , limit: }); +``` + +**Exemplo** + +```javascript +// limit +await Project.findAll({ limit: 10 }); +``` + +```javascript +// offset +await Project.findAll({ offset: 8 }); +``` + +```javascript +// limit & offset +await Project.findAll({ offset: 5, limit: 5 }); +``` + +**Query MySQL Equivalente** + +```sql +-- limit +SELECT * FROM Project +LIMIT 10; +``` + +```sql +-- offset +SELECT * FROM Project +OFFSET 8; +``` + +```sql +-- limit & offset +SELECT * FROM Project +OFFSET 5 +LIMIT 10; +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-basics.html#limits-and-pagination) + +[Voltar para Sumário](#sumário) + +--- + + +## findByPK + +Busca por um resultado, usando sua chave primária. + +**Template** + +```javascript +const results = await Model.findByPk(valor); +if (project === null) { + console.log('Not found!'); +} else { + console.log(results instanceof Model); // true + // a pk é +} +``` + +**Exemplo** + +```javascript +const project = await Project.findByPk(123); +if (project === null) { + console.log('Not found!'); +} else { + console.log(project instanceof Project); // true + // a pk é 123 +} +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-finders.html#-code-findbypk--code-) + +[Voltar para Sumário](#sumário) + +--- + +## findOne + +Busca o primeiro resultado filtrado pela busca. + +**Template** + +```javascript +const results = await Model.findOne({ where: { campo: valor } }); +if (results === null) { + console.log('Not found!'); +} else { + console.log(results instanceof Model); // true + console.log(results.campo); // valor +} +``` + +**Exemplo** + +```javascript +const project = await Project.findOne({ where: { title: 'Título' } }); +if (project === null) { + console.log('Not found!'); +} else { + console.log(project instanceof Project); // true + console.log(project.title); // 'Título' +} +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-finders.html#-code-findone--code-) + +[Voltar para Sumário](#sumário) + +--- + +## findOrCreate + +Criará uma entrada na tabela, a menos que encontre um resultado que preencha as opções de consulta. + +> Obs.: Em ambos os casos, ele retornará uma instância (a instância encontrada ou a instância criada) e um booleano indicando se essa instância foi criada ou já existia. + +**Template** + +```javascript +const [file, created] = await Model.findOrCreate({ + where: { filename: nome }, + defaults: { + campo: valor + } +}); +console.log(file.filename); +console.log(file.campo); +console.log(created); +if (created) { + console.log(file.campo); +} +``` + +**Exemplo** + +```javascript +const [user, created] = await User.findOrCreate({ + where: { username: 'Eric' }, + defaults: { + job: 'Technical Lead JavaScript' + } +}); +console.log(user.username); // 'Eric' +console.log(user.job); // pode ou não ser 'Technical Lead JavaScript' +console.log(created); // Valor booleano que indica se a instancia foi criada ou nao +if (created) { + console.log(user.job); // 'Technical Lead JavaScript' +} +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-finders.html#-code-findorcreate--code-) + +[Voltar para Sumário](#sumário) + +--- + +## findAndCountAll + +Método conveniente que combina findAll e count. + +**Template** + +```javascript +const { count, rows } = await Model.findAndCountAll({ + where: { + campo: { + [Op.]: 'foo%' + } + } +}); +``` + +**Exemplo** + +```javascript +const { Op } = require("sequelize"); + +const { count, rows } = await Project.findAndCountAll({ + where: { + title: { + [Op.like]: 'foo%' + } + }, + offset: 10, + limit: 2 +}); + +console.log(count); +console.log(rows); +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-finders.html#-code-findandcountall--code-) + +[Sessão Operadores](#operadores) + +[Voltar para Sumário](#sumário) + +--- + +## count + +**Template** + +```javascript +// simples +await Model.count(); +``` + +```javascript +// com filtro +const { Op } = require("sequelize"); + +await Model.count({ + where: { + : { + [Op.]: , + }, + }, +}); +``` + +**Exemplo** + +```javascript +// com filtro +const { Op } = require("sequelize"); + +await Project.count({ + where: { + id: { + [Op.gt]: 25 + } + } +}); +``` + +**Query MySQL Equivalente** + +```sql +SELECT COUNT('id') from project +WHERE 'id' > 25; +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-basics.html#-code-count--code-) + +[Sessão Operadores](#operadores) + +[Voltar para Sumário](#sumário) + +--- + +## max + +**Template** + +```javascript +await Model.max(); +``` + +**Exemplo** + +```javascript +await User.max('age'); +``` + +```javascript +// com filtragem +const { Op } = require("sequelize"); + +await User.max('age', { + where: { + age: { [Op.lt]: 20 }, + }, +}); +``` + +**Query MySQL Equivalente** + +```sql +SELECT MAX(age) FROM User; +``` + +```sql +--- com filtagem +SELECT MAX(age) +FROM User +WHERE age < 20; +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-basics.html#-code-max--code----code-min--code--and--code-sum--code-) + +[Sessão Operadores](#operadores) + +[Voltar para Sumário](#sumário) + +--- + +## min + +**Template** + +```javascript +await Model.min(); +``` + +**Exemplo** + +```javascript +await User.min('age'); +``` + +```javascript +// com filtragem +const { Op } = require("sequelize"); + +await User.min('age', { + where: { + age: { [Op.gt]: 5 }, + }, +}); +``` + +**Query MySQL Equivalente** + +```sql +SELECT MIN(age) FROM User; +``` + +```sql +--- com filtagem +SELECT MIN(age) +FROM User +WHERE age > 5; +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-basics.html#-code-max--code----code-min--code--and--code-sum--code-) + +[Sessão Operadores](#operadores) + +[Voltar para Sumário](#sumário) + +--- + +## sum + +**Template** + +```javascript +await Model.sum(); +``` + +**Exemplo** + +```javascript +await User.sum('age'); +``` + +```javascript +// com filtragem +const { Op } = require("sequelize"); + +await User.sum('age', { + where: { + age: { [Op.gt]: 5 }, + }, +}); +``` + +**Query MySQL Equivalente** + +```sql +SELECT SUM(age) FROM User; +``` + +```sql +--- com filtagem +SELECT SUM(age) +FROM User +WHERE age > 5; +``` + +[Documentação](https://sequelize.org/master/manual/model-querying-basics.html#-code-max--code----code-min--code--and--code-sum--code-) + +[Sessão Operadores](#operadores) + +[Voltar para Sumário](#sumário) + +--- diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..e69de29