Base de bot de discordPredefiniçõesBanco de dados

MongoDB

Veja como usar a predefinição de banco de dados MongoDB

Você vai precisar ter um banco de dados MongoDB para utilizar esta predefinição! Caso queira criar um na nuvem de forma gratuita, siga este guia

Env

O esquema de validação das variáveis de ambiente recebe uma nova propriedade, agora é necessário definir a URI do seu banco de dados na variável MONGO_URI:

.env
# ...
MONGO_URI=uri
# ... 

Veja um exemplo do formato de uma URI de banco de dados MongoDB:

  • mongodb+srv://<user>:<password>@<database>.subdomain.mongodb.net

Estrutura

A estrutura desta predefinição foi feita usando a biblioteca mongoose, então para criar nossos dados utilizamos schemas mongoose

O arquivo index.ts da pasta src/database deve fazer a conexão com o banco de dados:

src/database/index.ts
import mongoose, { InferSchemaType, model } from "mongoose";
import { guildSchema } from "./schemas/guild.js";
import { memberSchema } from "./schemas/member.js";
import { logger } from "#base";
import { env } from "#env";
import chalk from "chalk";

try {
   await mongoose.connect(env.MONGO_URI, { dbName: "database" });
   logger.success(chalk.green("MongoDB connected"));
} catch(err){
   logger.error(err);
   process.exit(1);
}

export const db = {
   guilds: model("guild", guildSchema, "guilds"),
   members: model("member", memberSchema, "members")
};

export type GuildSchema = InferSchemaType<typeof guildSchema>;
export type MemberSchema = InferSchemaType<typeof memberSchema>;

Os modelos dos documentos ficam no objeto da variável db, ou seja, para cada novo schema de documento que você criar, coloque o modelo como uma propriedade desta variável

Assim quando você precisar criar, ler, atualizar ou deletar dados, basta importar a variável db de #database e utilizar os métodos do modelo:

src/discord/commands/members.ts
import { createCommand } from "#base";
import { db } from "#database"; 
import { ApplicationCommandType } from "discord.js";

createCommand({
    name: "members",
    description: "Consultar os documentos de todos os membros",
    type: ApplicationCommandType.ChatInput,
    async run(interaction){
        const documents = await db.members.find(); 

        for(const doc of documents){
            console.log(doc.id);
            console.log(doc.guildId);
        }

        // ...
    }
});

Sempre use a variável db do atalho de importação "#database", dessa forma o arquivo que contém o código que faz a conexão com o banco de dados é chamado.

Schemas

Crie seus schemas mongoose na pasta src/database/schemas/ para uma melhor organização. Veja os schemas de exemplo que vem por padrão:

src/database/schemas/member.ts
import { Schema } from "mongoose";
import { t } from "../utils.js";

export const memberSchema = new Schema(
    {
        id: t.string,
        guildId: t.string,
        wallet: {
            coins: { type: Number, default: 0 },
        }
    },
    {
        statics: {
            async get(member: { id: string, guild: { id: string } }) {
                const query = { id: member.id, guildId: member.guild.id };
                return await this.findOne(query) ?? this.create(query);
            }
        }
    },
);

Depois de criar seu schema, importe ele no arquivo index.ts da pasta src/database e crie um modelo pra ele no objeto da variável db:

src/database/index.ts
import /* ... */ { /* ... */ model } from "mongoose";
import { guildSchema } from "./schemas/guild.js";
import { memberSchema } from "./schemas/member.js";

// ...

export const db = {
    guilds: model("guild", guildSchema, "guilds"), 
    members: model("member", memberSchema, "members") 
};

// ...

Se precisar dos tipos das propriedades dos documentos, extraia o tipo dos schemas:

src/database/index.ts
import /* ... */ { /* ... */ InferSchemaType } from "mongoose";
import { guildSchema } from "./schemas/guild.js";
import { memberSchema } from "./schemas/member.js";

// ...

export type GuildSchema = InferSchemaType<typeof guildSchema>;
export type MemberSchema = InferSchemaType<typeof memberSchema>;

Nesta página