MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como limpar sessões antigas / obsoletas ao usar o armazenamento de sessão do Mongo DB em Ruby on Rails 3.2


A chave para resolver isso é entender que usar o Mongoid direto métodos quando o session_store do seu aplicativo Rails 3 está definido como mongoid_store nunca permitiria que esse tipo de interação direta com o banco de dados acontecesse.

Então, em vez disso, usando o Mongoid apenas para a conexão básica do banco de dados, mas na verdade interagindo com o Moped núcleo do Mongoid diretamente no nível de operação do driver, a mesma funcionalidade pode ser alcançada com facilidade! Aqui está o Mongoid/Moped rake tarefa que criei que funciona muito bem:
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

A conexão é definida via db = Mongoid::Sessions.default e a mágica acontece na linha:
db[:sessions].where('updated_at' => { '$lt' => stale_window.days.ago }).sort(updated_at: 1).no_timeout.remove_all

Eu configurei uma stale_window variável para que eu possa ajustar facilmente o alcance desta tarefa; define o valor DB, bem como a descrição. Para usá-lo, eu o executo assim a partir do caminho da base de código:
RAILS_ENV=production bundle exec rake sessions:cleanup

E, claro, basta alterar o RAILS_ENV valor para corresponder ao ambiente em que você deseja que essa tarefa atue; como staging , development ou qualquer outro nome que você possa nomear seu ambiente. Depois de executar esse rake tarefa, as sessions A tabela de coleta é reduzida para algo mais realista com o uso no mundo real e o tamanho geral do banco de dados é mais razoável para lidar.