MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB Najlepszy sposób na parowanie i usuwanie kolejnych wpisów w bazie danych

Jedna rzecz, która przychodzi mi do głowy, to to, że być może nie musisz wykonywać całej pracy, o której myślisz, że musisz, a Twój problem można prawdopodobnie rozwiązać z niewielką pomocą Indeksy TTL i prawdopodobnie kolekcje ograniczone . Rozważ następujące wpisy:

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

Więc są dwa wpisy i masz ten _id wartość z powrotem po wstawieniu. Tak więc na początku „A” nie miał z kim grać, ale wpis „B” będzie grał przeciwko temu przed nim.

ObejctId są monotoniczne , co oznacza, że ​​„następny” to zawsze większą wartość od ostatniego. Więc z wstawionymi danymi, po prostu zrób to:

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

Daje to poprzedni wstawiony „ruch” do bieżącego ruchu, który właśnie został wykonany, i robi to, ponieważ cokolwiek który został wcześniej wstawiony będzie miał _id z mniejszą wartością niż bieżąca pozycja. Upewniasz się również, że nie "grasz" przeciwko własnemu ruchowi użytkownika i oczywiście ograniczasz wynik tylko do jednego dokumentu.

Tak więc "ruchy" będą zawsze posuwać się do przodu. Gdy następne wstawienie zostanie wykonane przez użytkownika "C", dostanie "ruch" od użytkownika "B", a następnie użytkownik "A" otrzyma "ruch" od użytkownika "C" i tak dalej.

Wszystko, co „może” się tutaj wydarzyć, to to, że „B” tworzy następny "przesuń się" w kolejności, a podniesiesz ten sam dokument, co w ostatnim żądaniu. Ale to jest punkt dla twojego projekt „sesji”, aby zapisać ostatni „wynik” i upewnić się, że nie odzyskałeś tego samego, i jako taki zajmij się tym niezależnie od ty chcesz w swoim projekcie.

To powinno wystarczyć do „zabawy”. Ale przejdźmy do Twojego „usunięcia " część.

Oczywiście „myślisz”, że chcesz coś usunąć, ale wracając do moich początkowych „pomocników”, nie powinno to być konieczne. Z góry usuwanie staje się tylko czynnikiem „sprzątania”, więc Twoja kolekcja nie rozrasta się do ogromnych rozmiarów.

Jeśli zastosowałeś indeks TTL, w podobny sposób jak ten samouczek wyjaśnia, że ​​wpisy kolekcji zostaną dla Ciebie wyczyszczone i usunięte po pewnym czasie.

Co można zrobić, zwłaszcza biorąc pod uwagę, że używamy rosnącego charakter _id klucz i że jest to mniej więcej „kolejka” z natury, możesz ewentualnie zastosować to jako kolekcja ograniczona . Możesz więc ustawić maksymalny rozmiar określający, ile „ruchów” zachowasz w dowolnym momencie.

Łącząc te dwie rzeczy razem, otrzymujesz coś, co „rośnie” tylko do określonego rozmiaru i zostanie automatycznie wyczyszczone, jeśli aktywność nieco zwolni. Dzięki temu wszystkie operacje będą szybkie .

Podsumowując, współbieżność „usuwa ", o który się martwiłeś, zostało usunięte przez faktyczne "usunięcie" potrzeby usuwania dokumentów, które właśnie zostały odtworzone. Zapytanie jest proste, a indeks TTL i kolekcja z limitami zapewniają zarządzanie danymi za Ciebie.

Oto moje zdanie na temat bardzo jednoczesnej gry „Blind War”.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongodb 4+ findOneAndUpdate() returnNewDocument nie działa

  2. Przesyłaj strumieniowo z kursora mongodb do odpowiedzi Express w node.js

  3. MongoDB pomaga w rekomendacjach

  4. Czy istnieje możliwość obejścia maksymalnego rozmiaru bson MongoDB?

  5. nazwa pola ClassName jest wstawiana do mongodb przez morphia