【问题标题】:How to delete an image file from GridFS by file metadata?如何通过文件元数据从 GridFS 中删除图像文件?
【发布时间】: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 删除或其他元数据也会删除所有关联的块?

【问题讨论】:

    标签: python mongodb pymongo gridfs


    【解决方案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.filesfs.chunks 具有 1:many 关系)。由于您使用的是 GridFS 模块提供的fs.delete(_id) 方法,它将从两个集合中删除所有关联数据。
    猜你喜欢
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多