Ruby中的GridFS:如何upsert?

时间:2010-08-05 04:20:42

标签: ruby mongodb upsert gridfs

GridFS是否有upsert?

例如,如果我想用指定的_id保存图像,并且已存在具有相同_id的图像,我希望它覆盖(更新)它。否则,插入它。

2 个答案:

答案 0 :(得分:4)

规范实际上并不是为支持upsert而设计的,因为你在技术上修改了多个文档,并且肯定会出现棘手的竞争条件。所以我们推荐Matt做了什么,先删除然后再放。

答案 1 :(得分:3)

我查看了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