如何在 GridFS 中更新 Saved Document Extra 数据

How to update Saved Document Extra data in GridFS

我在 gridFS 上存储了文件,这些文件存储了额外的信息 - 它没有在元数据上设置,否则我会使用

对于 Pymongo 3.2.2,我们将信息存储在与 fs.files 中实际数据相同的级别(不使用元数据)

例如我们有:

fs.files = [ {
_id, description, title, ...
}]

当我像这样调用 GridFS.put 时没有任何反应

FS = GridFS(mongo_,)
file.description = request_data.get('description', None)
FS.put(file)

如何更新该文件的额外信息,例如描述?

在不使用 GridFS 的情况下手动更新那些额外的字段:

file = mongo_.fs.files.find_one({'_id': ObjectId(fileId)})
file['description'] = request_data.get('description', None)
mongo_.fs.files.save(file)

您的代码示例中的 file 是什么?也就是说,你传递给 GridFS.put 的是什么?

要将元数据添加到 GridFS 文件,请将额外的关键字参数传递给 putas it shows in the PyMongo tutorial:

>>> fs.put(b'data', filename='foo', description='my description')
ObjectId('5825ea8ea08bff9df5059099')

现在元数据与您的数据一起存储在 GridFS 中:

>>> gridout = fs.get(ObjectId('5825ea8ea08bff9df5059099'))
>>> gridout.description
u'my description'

在幕后,您可以看到 PyMongo 将元数据存储在 MongoDB 中的 fs.files 集合中:

>>> for doc in db.fs.files.find()
...     print(doc.get('description'))
...     
my description

但是访问 GridFS 数据的更好方法是使用 PyMongo 的 GridFS API,而不是直接查询集合。

另一种存储元数据的方法是创建一个 GridIn,设置一个字段,然后调用 close:

>>> gridin = fs.new_file()
>>> gridin.filename = 'foo'
>>> gridin.description = 'my description'
>>> gridin.write(b'data')
>>> gridin.close()

如果您需要使用数据块多次调用 write,这是一个不错的选择。