GridFS 有 upsert 吗?
例如,如果我想保存具有指定 _id 的图像,并且已经存在具有相同 _id 的图像,我希望它覆盖(更新)它。否则,插入它。
该规范并非真正旨在支持 upsert,因为您在技术上修改了多个文档,并且肯定会出现棘手的竞争条件。所以我们推荐Matt的做法,就是先delete再放。
我查看了 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)
请参阅此处的工作 sinatra 脚本:http: //github.com/acani/acani-sinatra/blob/master/acani.rb#L97