如何通过文件元数据从GridFS中删除图像文件?

use*_*287 5 python mongodb pymongo gridfs

我有一个包含以下元数据的图像:

> db.fs.files.find().pretty()
{
    "_id" : ObjectId("4576874577342672346"),
    "chunkSize" : 262144,
    "user_name" : "my name",
    "filename" : "image.jpg",
    "length" : 7103,
    "uploadDate" : ISODate("2014-01-23T13:31:48.155Z"),
    "user_email" : "email@email.com",
    "md5" : "1234567890"
}
>
Run Code Online (Sandbox Code Playgroud)

我想从 Python (PyMongo) 中删除图像。

上的文档delete()似乎规定该delete()函数中唯一接受的参数是file_id

http://api.mongodb.org/python/current/api/gridfs/#gridfs.GridFS.delete

以编程方式,我有以下可以在文件元数据中匹配的值:

  • 用户名
  • 文档名称
  • 用户邮箱

我该如何:

  • 获取file_id(必要时通过使用上述值)或
  • 删除基于元数据字段以外的文件file_id

此外,我目前仅使用单个块文件进行测试,如果将来与更大的文件交互是否会删除file_id或其他元数据也会删除所有关联的块?

use*_*287 5

这是我刚刚尝试过的方法,没有考虑是否有必要或最好的方法,但它确实有效。

因此,以编程方式,我可以_id通过查询文件元数据来获取可用信息:

Python 外壳:

>>> import pymongo
>>> import os
>>> hostname = os.environ['OPENSHIFT_MONGODB_DB_URL']
>>> conn = pymongo.MongoClient(host=hostname)
>>> db = conn.grid_files
>>> collection = db.fs.files
>>> result = collection.find_one({"user_email":"email@email.com","name":"my name","filename":"image.jpg"})
>>> result['_id']
ObjectId('52e119c47091447a86891d98')

# now use the _id to delete the file
>>> files_id = result['_id']
>>> import gridfs
>>> fs = gridfs.GridFS(db)
>>> fs.delete(files_id)
Run Code Online (Sandbox Code Playgroud)

  • 是的,这个方法效果很好。“GridFS”实际上只是映射到普通 MongoDB 集合的约定(默认情况下,“fs.files”与“fs.chunks”具有一对多关系)。由于您使用的是 GridFS 模块提供的“fs.delete(_id)”方法,因此它将从两个集合中删除所有关联的数据。 (2认同)