MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB Il modo migliore per accoppiare ed eliminare voci di database sequenziali

Una cosa che mi viene in mente qui è che potresti non aver bisogno di fare tutto il lavoro che ritieni necessario e il tuo problema può probabilmente essere risolto con un piccolo aiuto da Indici TTL e possibilmente raccolte limitate . Considera le seguenti voci:

{ "_id" : ObjectId("531cf5f3ba53b9dd07756bb7"), "user" : "A", "units" : 50 }
{ "_id" : ObjectId("531cf622ba53b9dd07756bb9"), "user" : "B", "units" : 62 }

Quindi ci sono due voci e hai quel _id valore indietro quando hai inserito. Quindi all'inizio "A" non aveva nessuno contro cui giocare, ma la voce per "B" giocherà contro quella precedente.

Gli ObejctId sono monotonici , il che significa che quello "successivo" è sempre maggiore di valore rispetto all'ultimo. Quindi, con i dati inseriti, fai questo:

db.moves.find({ 
    _id: {$lt: ObjectId("531cf622ba53b9dd07756bb9") }, 
    user: { $ne: "B" } 
}).limit(1)

Ciò fornisce la "mossa" inserita precedente alla mossa corrente che è stata appena eseguita, e lo fa perché qualsiasi cosa precedentemente inserito avrà un _id con meno valore rispetto all'elemento corrente. Ti assicuri anche di non "giocare" contro la mossa dell'utente e ovviamente limiti il ​​risultato a un solo documento.

Quindi le "mosse" andranno avanti per sempre, quando l'inserimento successivo viene effettuato dall'utente "C" ottengono la "mossa" dall'utente "B", e quindi l'utente "A" otterrà la "mossa" dall'utente "C ", e così via.

Tutto ciò che "potrebbe" accadere qui è che "B" faccia il successivo "sposta" in sequenza e prenderesti lo stesso documento dell'ultima richiesta. Ma questo è un punto per il tuo design di "sessione", per memorizzare l'ultimo "risultato" e assicurarsi di non ricevere indietro la stessa cosa e, come tale, gestirlo come voi vuoi nel tuo design.

Dovrebbe essere sufficiente per "giocare". Ma veniamo alla tua "eliminazione " parte.

Naturalmente "pensi" di voler eliminare le cose, ma tornando ai miei "aiutanti" iniziali questo non dovrebbe essere necessario. Dall'alto, l'eliminazione diventa solo un fattore di "ripulitura", quindi la tua collezione non cresce in proporzioni enormi.

Se hai applicato un indice TTL, più o meno allo stesso modo di questo tutorial spiega, le voci della tua raccolta verranno ripulite per te e rimosse dopo un certo periodo di tempo.

Anche cosa si può fare, e soprattutto considerando che stiamo usando il crescente natura del _id chiave e che questa è più o meno una "coda" in natura, potresti eventualmente applicarla come raccolta limitata . Quindi puoi impostare una dimensione massima su quante "mosse" conserverai in qualsiasi momento.

Combinando i due insieme, ottieni qualcosa che "cresce" solo a una certa dimensione e verrà automaticamente pulito per te, se l'attività dovesse rallentare un po'. E questo manterrà tutte le operazioni veloci .

La conclusione è che la simultaneità di "elimina " di cui eri preoccupato è stato rimosso effettivamente "rimuovendo" la necessità di eliminare i documenti appena riprodotti. La query lo semplifica e l'indice TTL e la raccolta limitata si occupano della gestione dei dati per te.

Quindi ecco qual è la mia opinione su un gioco molto simultaneo di "Blind War".