如何通过文件元数据从 GridFS 中删除图像文件?
Posted
技术标签:
【中文标题】如何通过文件元数据从 GridFS 中删除图像文件?【英文标题】:How to delete an image file from GridFS by file metadata? 【发布时间】:2014-02-14 04:47:42 【问题描述】:我有一张包含以下元数据的图片:
> 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"
>
我想从 Python (PyMongo) 中删除图像。
delete()
上的文档似乎规定delete()
函数中唯一接受的参数是file_id
:
http://api.mongodb.org/python/current/api/gridfs/#gridfs.GridFS.delete
以编程方式,我可以在文件元数据中匹配以下可用值:
用户名 文件名 user_email我该怎么做:
获取file_id
(必要时通过使用上述值)或
根据file_id
以外的元数据字段删除文件?
另外,我目前只测试单个块文件,如果将来与更大的文件交互会被file_id
删除或其他元数据也会删除所有关联的块?
【问题讨论】:
【参考方案1】:这是我刚尝试过的东西,没有考虑是否有必要或最好的方法,但它确实有效。
因此,我可以通过对文件元数据的查询获得_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)
【讨论】:
是的,这种方法效果很好。GridFS
实际上只是映射到普通 MongoDB 集合的约定(默认情况下 fs.files
与 fs.chunks
具有 1:many 关系)。由于您使用的是 GridFS 模块提供的fs.delete(_id)
方法,它将从两个集合中删除所有关联数据。以上是关于如何通过文件元数据从 GridFS 中删除图像文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Sails.JS + GridFS 从 Mongo 检索图像文件?
Ruby操作MongoDB数据库(进阶十二)--GridFS