MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment effacer les sessions anciennes/périmées lors de l'utilisation du stockage de session Mongo DB dans Ruby on Rails 3.2

La clé pour résoudre ce problème est de comprendre que l'utilisation directe de Mongoid méthodes lorsque le session_store de votre application Rails 3 est défini sur mongoid_store ne permettrait jamais ce type d'interaction directe avec la base de données.

Donc, à la place, en utilisant Mongoid uniquement pour la connexion de base à la base de données, mais en interagissant ensuite avec le Moped noyau de Mongoid directement au niveau de l'opération du pilote, la même fonctionnalité peut être obtenue facilement ! Voici le rake Mongoid/Moped tâche que j'ai trouvée qui fonctionne plutôt bien :

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

La connexion est définie via db = Mongoid::Sessions.default et la magie opère dans la ligne :

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

J'ai défini un stale_window variable afin que je puisse facilement ajuster la portée de cette tâche ; définit la valeur DB ainsi que la description. Pour l'utiliser, je le lance comme ceci à partir du chemin de la base de code :

RAILS_ENV=production bundle exec rake sessions:cleanup

Et bien sûr il suffit de changer le RAILS_ENV valeur correspondant à l'environnement sur lequel vous souhaitez que cette tâche agisse ; comme staging , development ou tout autre nom que vous pourriez donner à votre environnement. Après avoir exécuté ce rake tâche, les sessions La table de collection est réduite à quelque chose de plus réaliste avec une utilisation réelle et la taille globale de la base de données est plus raisonnable à gérer.