GridFS にはアップサートがありますか?
たとえば、指定した _id を持つ画像を保存したい場合、同じ _id を持つ画像が既に存在する場合、上書き (更新) します。それ以外の場合は挿入します。
技術的には複数のドキュメントを変更しているため、この仕様はアップサートをサポートするように実際には設計されておらず、確かにトリッキーな競合状態が発生する可能性があります。そのため、Matt が行ったこと、つまり、最初に削除してから配置することをお勧めします。
私はmongo ruby gemのソースコードを見て、これを見つけました:
# 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={})
だから、私はコードでこれを行いました:
grid.delete(id) # if exists
grid.put(tmp_file.read, :_id => id, :content_type => file_type)
ここで実際のシナトラ スクリプトを参照してください: http://github.com/acani/acani-sinatra/blob/master/acani.rb#L97