sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo borrar sesiones antiguas/obsoletas cuando se usa el almacenamiento de sesión de Mongo DB en Ruby on Rails 3.2

La clave para resolver esto es comprender que el uso directo de Mongoid cuando el session_store de su aplicación Rails 3 está establecido en mongoid_store nunca permitiría que sucediera este tipo de interacción directa con la base de datos.

Entonces, en su lugar, usando Mongoid solo para la conexión básica de la base de datos pero luego interactuando con el Moped core de Mongoid directamente en un nivel de operación del controlador, ¡la misma funcionalidad se puede lograr con facilidad! Aquí está el rake Mongoid/Moped tarea que se me ocurrió que funciona bastante 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 conexión se establece a través de db = Mongoid::Sessions.default y la magia sucede en la línea:

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

He configurado una stale_window variable para que pueda ajustar fácilmente el rango de esta tarea; establece el valor DB así como la descripción. Para usarlo, lo ejecuto así desde la ruta del código base:

RAILS_ENV=production bundle exec rake sessions:cleanup

Y, por supuesto, simplemente cambie el RAILS_ENV valor para que coincida con el entorno en el que desea que actúe esta tarea; como staging , development o cualquier otra cosa que pueda llamar a su entorno. Después de ejecutar ese rake tarea, las sessions la tabla de colección se reduce a algo más realista con el uso del mundo real y el tamaño general de la base de datos es más razonable de manejar.