4

GridFS 有 upsert 吗?

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

4

2 回答 2

4

该规范并非真正旨在支持 upsert,因为您在技术上修改了多个文档,并且肯定会出现棘手的竞争条件。所以我们推荐Matt的做法,就是先delete再放。

于 2010-08-05T12:36:49.303 回答
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

于 2010-08-05T05:58:14.990 回答