node.js - Manejo de Múltiples Cambios en Diferentes Objetos en un Arreglo Usando Mongoose
Estoy creando un bot de Discord usando discord.js y TypeScript. Estoy creando un sistema de niveles donde obtienes XP por enviar mensajes.
Estoy usando Mongoose para interactuar con mi base de datos, alojada en MongoDB.
Aquí está el código de mi esquema:
import { Schema, model } from "mongoose";
interface IGuildProfiles {
guildid: number;
levels: {
userid: number;
totalXp: number;
level: number;
levelXp: number;
levelXpNeeded: number;
obtained: { level: number; date: number }[];
}[];
}
const guildProfiles = new Schema<IGuildProfiles>(
{
guildid: {type: Number, required: true},
levels: [
{
userid: {type: Number, required: true},
totalXp: {type: Number, required: true},
level: {type: Number, required: true},
levelXp: {type: Number, required: true},
levelXpNeeded: {type: Number, required: true},
obtained: [{ level: {type: Number, required: true}, date: {type: Number, required: true} }],
},
],
},
{ timestamps: true }
);
export default model("GuildProfiles", guildProfiles);
Esto crea un documento que contiene un ID de gremio y un arreglo de información sobre el nivel de cada usuario en el gremio.
No hay nada de malo en esto, pero en el caso de que el bot haga múltiples escrituras en el mismo documento de la guild al mismo tiempo, ¿tendría esto un efecto secundario no intencionado de saltarse XP a veces, o no hay nada de qué preocuparse?
Lo que me preocupa:
// First Write (Around the same time as other writes)
const data = getDataSomeHow() // {id: 123, example:[]}
writeDataSomeHow() // writes {id:123, example: [{exampleString:"THIS IS THE FIRST WRITE"}]}
// Second Write (Around the same time as other writes)
const data = getDataSomeHow() // {id: 123, example:[]}
writeDataSomeHow() // writes {id:123, example: [{exampleString:"THIS IS THE SECOND WRITE"}]}
// Third Write (Around the same time as other writes)
const data = getDataSomeHow() // {id: 123, example:[]}
writeDataSomeHow() // writes {id:123, example: [{exampleString:"THIS IS THE THIRD WRITE"}]}
// Checking the written data
const data = getDataSomeHow()
/* What I think the data will be because of the side effect:
{id:123, example: [{exampleString:"THIS IS THE THIRD WRITE"}]}
What I want the data to be:
{id:123, example: [{exampleString:"THIS IS THE FIRST WRITE"}, {exampleString:"THIS IS THE SECOND WRITE"}, {exampleString:"THIS IS THE THIRD WRITE"}]}
*/
¿Está esto destinado a suceder, o me equivoco? Si va a suceder, ¿cómo puedo evitarlo?