【问题标题】:The gridfs "list" method returns empty list with non empty collectiongridfs "list" 方法返回非空集合的空列表
【发布时间】: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'''

【问题讨论】:

    标签: python mongodb list pymongo gridfs


    【解决方案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 返回一个“文件名”值列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      • 2020-11-06
      相关资源
      最近更新 更多