2014-01-23 56 views
2

我有以下元数据的图像:如何通过文件元数据从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 protected]", 
    "md5" : "1234567890" 
} 
> 

我想删除的Python(PyMongo)的图像。

delete()的文件似乎规定在delete()功能唯一可以接受的参数是file_id

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

编程,我有可用,可以在文件的元数据进行匹配以下值:

  • USER_NAME
  • USER_EMAIL

我怎么可以:

  • 获取file_id(通过使用上述值,如果有必要的)或
  • 删除基于比file_id其他元数据字段的文件吗?

此外,我目前只用单块文件测试,如果有更大的文件,今后将删除交互通过file_id或其他元数据删除所有相关的块呢?

回答

1

这是我刚刚尝试过的一些事情,但没有想到它是否有必要或最好的方法,但它的工作原理。

所以编程我能有_id提供查询的文件的元数据:

Python Shell中:

>>> 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 protected]","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) 
+2

是,这种方法工作得很好。 'GridFS'实际上只是一个映射到普通MongoDB集合的约定(默认情况下'fs.files'与'fs.chunks'具有1:多关系)。由于您正在使用GridFS模块提供的'fs.delete(_id)'方法,因此它将从两个集合中删除所有关联的数据。 – Stennie

+0

感谢您的澄清和额外的信息。 – user1063287