GridFS en Ruby: Cómo upsert?
Pregunta
GridFS sí tiene un upsert?
Por ejemplo, si quiero guardar una imagen con un _id especificado, y una con el mismo _id ya existe, lo quiero para sobrescribir (actualización) de ella. De lo contrario, insertarlo.
Solución
La especificación no es realmente diseñado para upserts de apoyo, ya que está técnicamente modificar más de un documento, y sin duda puede surgir condiciones de carrera difíciles. Por lo que recomendamos lo que Matt ha hecho, que es eliminar primero y luego poner.
Otros consejos
Me miraba el código fuente gema mongo rubí y encontró lo siguiente:
# Store a file in the file store. This method is designed only for writing new files;
# if you need to update a given file, first delete it using #Grid#delete.
# ...
def put(data, opts={})
Por lo tanto, hice esto en el código:
grid.delete(id) # if exists
grid.put(tmp_file.read, :_id => id, :content_type => file_type)
Consulte el guión Sinatra trabajar aquí: http://github.com/acani/acani-sinatra/ blob / maestro / acani.rb # L97