sql >> Database >  >> NoSQL >> MongoDB

Oude/verouderde sessies wissen bij gebruik van Mongo DB-sessieopslag in Ruby on Rails 3.2

De sleutel om dit op te lossen is te begrijpen dat het gebruik van directe Mongoid methoden wanneer de session_store . van uw Rails 3-toepassing is ingesteld op mongoid_store zou dit soort directe database-interactie nooit toestaan.

Dus in plaats daarvan, door Mongoid alleen te gebruiken voor de basisdatabaseverbinding, maar dan daadwerkelijk te communiceren met de bromfiets kern van Mongoid direct op het bedieningsniveau van de bestuurder, dezelfde functionaliteit kan gemakkelijk worden bereikt! Hier is de mongoïde/bromfiets rake taak die ik heb bedacht en die redelijk goed werkt:

namespace :sessions do
  stale_window = 7
  desc "Clear stale DB sessions older than #{ stale_window } days."
  task :cleanup => :environment do
    db = Mongoid::Sessions.default
    begin
      db[:sessions].where('updated_at' => { '$lt' => stale_window.days.ago }).sort(updated_at: 1).no_timeout.remove_all
    rescue Moped::Errors::SocketError => e
      # Rescue here if needed. If not, the screwed up process dies silently.
    end
  end
end

De verbinding wordt ingesteld via db = Mongoid::Sessions.default en de magie gebeurt in de regel:

db[:sessions].where('updated_at' => { '$lt' => stale_window.days.ago }).sort(updated_at: 1).no_timeout.remove_all

Ik heb een stale_window ingesteld variabel zodat ik het bereik van deze taak gemakkelijk kan aanpassen; stelt zowel de DB-waarde als de beschrijving in. Om het te gebruiken, voer ik het als volgt uit vanaf het codebase-pad:

RAILS_ENV=production bundle exec rake sessions:cleanup

En natuurlijk verander gewoon de RAILS_ENV waarde die past bij de omgeving waarin u wilt dat deze taak werkt; zoals staging , development of hoe je je omgeving ook maar wilt noemen. Na het uitvoeren van die rake taak, de sessions verzamelingstabel wordt gesnoeid tot iets realistischer met gebruik in de echte wereld en de totale databasegrootte is redelijker om mee om te gaan.




  1. MongoDB docker-container kan socketbestand niet ontkoppelen

  2. Wat is het equivalent van de shellopdracht collection.getIndexes() in pymongo?

  3. Tekstzoekopdracht voor tekst anders levert altijd geen resultaten op?

  4. Wat is het voordeel van het gebruik van een ObjectId in plaats van een gewone String?