gridfs "list" 方法返回非空集合的空列表
Posted
技术标签:
【中文标题】gridfs "list" 方法返回非空集合的空列表【英文标题】:The gridfs "list" method returns empty list with non empty collection 【发布时间】:2016-09-12 23:20:46 【问题描述】:我们可以使用 PyMongo 而不是使用 list 函数来获取存储在 GridFS
中的文件数吗?
另外,当我在gridfs
下尝试list()
方法时,虽然数据库中有文件,但它给了我一个空列表。我能够通过使用_id
使用get()
方法检索文件。
如果我们保存没有文件名的文件并依赖_id
值,list() 函数是否返回存储在gridfs
db
下的所有文件的列表。
代码:
client = pymongo.MongoClient(connect=False)
grid_db = client['gridDB']
fs = gridfs.GridFS(grid_db)
# Save an image
img_identifier = fs.put(img, encoding="utf-8")
# List the files stored
print fs.list()
'''[] Console shows empty array'''
【问题讨论】:
【参考方案1】:这是预期的结果。原因是您在插入(放置)期间没有为字段filename
设置值,但是list
方法返回集合中filename
字段的distinct
值。因此,如果集合中不存在该字段,它将返回空列表。 See the list()
method implementation.
def list(self):
"""List the names of all files stored in this instance of
:class:`GridFS`.
.. versionchanged:: 3.1
``list`` no longer ensures indexes.
"""
# With an index, distinct includes documents with no filename
# as None.
return [
name for name in self.__files.distinct("filename")
if name is not None]
演示:
>>> import pprint
>>> from pymongo import MongoClient
>>> import gridfs
>>> client = MongoClient()
>>> db = client.demo
>>> fs = gridfs.GridFS(db)
>>> fs.put('img.jpg', encoding='utf-8')
ObjectId('573af0960acf4555437ceaa9')
>>> fs.list()
[]
>>> pprint.pprint(db['fs.files'].find_one())
'_id': ObjectId('573af0960acf4555437ceaa9'),
'chunkSize': 261120,
'encoding': 'utf-8',
'length': 7,
'md5': '82341a6c6f03e3af261a95ba81050c0a',
'uploadDate': datetime.datetime(2016, 5, 17, 10, 21, 11, 38000)
如您所见,您的文档中不存在字段filename
。现在让我们传入filename
参数:
>>> client.drop_database(db) # drop our demo database
>>> fs.put('img.jpg', encoding='utf-8', filename='img.jpg')
ObjectId('573af1740acf4555437ceaab')
>>> fs.list()
['img.jpg']
>>> pprint.pprint(db['fs.files'].find_one())
'_id': ObjectId('573af1740acf4555437ceaab'),
'chunkSize': 261120,
'encoding': 'utf-8',
'filename': 'img.jpg',
'length': 7,
'md5': '82341a6c6f03e3af261a95ba81050c0a',
'uploadDate': datetime.datetime(2016, 5, 17, 10, 24, 53, 449000)
如您所见,list
返回一个“文件名”值列表。
【讨论】:
以上是关于gridfs "list" 方法返回非空集合的空列表的主要内容,如果未能解决你的问题,请参考以下文章
gridfs-stream 总是用“contentType: binary/octet-stream”存储文件