python - gridfs "list"方法返回具有非空集合的空列表

标签 python mongodb list pymongo gridfs

我们可以使用 PyMongo 而不是使用列表函数来获取存储在 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'''

最佳答案

这是预期的结果。原因是您没有为字段 filename 设置值在插入(放置)期间,但是 list 方法返回 distinct集合中 filename 字段的值。因此,如果集合中不存在该字段,它将返回空列表。 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 返回“文件名”值的列表。

关于python - gridfs "list"方法返回具有非空集合的空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37266282/

相关文章:

Python - 为 3d 线图着色

c# - MongoDB 中是否有等效的 SEQUENCE

MongoDB 内存不足

c# - 声明一个列表并使用一个代码语句填充值

java - Java 迭代器的 2 种形式

python - tensorflow 和 Pycharm

python - 在 BeautifulSoup 中用另一种标签替换一种标签

c# - 如何在 Linq 中组合多个相同或不同长度的列表?

python - 从 udp 接收符号,为什么?

MongoDB:$unset 替换为 null?