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

MongoDB Bedste måde at parre og slette sekventielle databaseposter

En ting, der kommer til at tænke på her, er, at du måske ikke behøver at gøre alt det arbejde, du tror, ​​du skal, og dit problem kan sandsynligvis løses med lidt hjælp fra TTL-indekser og muligvis afgrænsede samlinger . Overvej følgende poster:

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

Så der er to poster, og du fik det _id værdi tilbage, når du indsatte. Så i starten havde "A" ingen at spille imod, men indgangen til "B" vil spille mod den før.

ObejctId'er er monotone , hvilket betyder, at den "næste" med er altid større i værdi fra sidst. Så med de indsatte data skal du bare gøre dette:

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

Det giver det foregående indsatte "flytning" til det aktuelle træk, der lige blev foretaget, og gør dette fordi alt som tidligere blev indsat vil have et _id med mindre værdi end den aktuelle vare. Du sørger også for, at du ikke "spiller" mod brugerens eget træk, og du begrænser naturligvis resultatet til kun ét dokument.

Så "bevægelserne" vil for evigt bevæge sig fremad. Når den næste indsættelse er lavet af bruger "C" får de "flytningen" fra bruger "B", og derefter ville bruger "A" få "flytningen" fra bruger "C ", og så videre.

Det eneste, der "kunne" ske her, er, at "B" gør det næste "flyt" i rækkefølge, og du ville hente det samme dokument som i den sidste anmodning. Men det er en pointe for din "session" design, for at gemme det sidste "resultat" og sikre dig, at du ikke fik det samme tilbage, og som sådan håndtere det, uanset hvor du ønsker i dit design.

Det burde være nok at "lege" med. Men lad os komme til din "sletning " del.

Naturligvis "tror" du, at du vil slette ting, men tilbage til mine indledende "hjælpere" burde dette ikke være nødvendigt. Fra oven bliver sletning kun en faktor for "oprydning", så din samling vokser ikke til massive proportioner.

Hvis du har anvendt et TTL-indeks, på nogenlunde samme måde som denne vejledning forklarer, vil dine indsamlingsposter blive ryddet op for dig og fjernet efter en vis periode.

Også hvad der kan gøres, og især i betragtning af at vi bruger forøgelsen arten af ​​_id og at dette mere eller mindre er en "kø" i naturen, kan du muligvis anvende dette som en afgrænset samling . Så du kan indstille en maksimal størrelse til, hvor mange "træk" du vil beholde på ethvert givet tidspunkt.

Kombinerer du de to sammen, får du noget, der kun "vokser" til en vis størrelse, og som automatisk bliver renset for dig, hvis aktiviteten går lidt ned. Og det vil holde alle operationer hurtige .

Nederste linje er, at samtidigheden af ​​"sletter ", som du var bekymret for, er blevet fjernet ved faktisk at "fjerne" behovet for at slette de dokumenter, der lige blev afspillet. Forespørgslen gør det simpelt, og TTL-indekset og den begrænsede samling sørger for din datahåndtering for dig.

Så der har du, hvad jeg synes om et meget samtidig spil "Blind War".




  1. Hvordan man validerer i Mongoose et array og samtidig dets elementer

  2. PHP mongo find felt starter med

  3. MongoDB filtrerer flere underdokumenter

  4. Sådan opretter du forbindelse til mongoDB Atlas ved hjælp af mongoose