【问题标题】:Retrieve document '_id' of a GridFS document, by its 'filename'通过“文件名”检索 GridFS 文档的文档“_id”
【发布时间】:2020-11-27 13:26:46
【问题描述】:

我目前正在处理一个项目,我必须在其中检索使用 GridFS 上传到 MongoDB 数据库的文档并将其存储在我的本地目录中。

到目前为止,我已经写了这几行代码:

if not fs.exists({'filename': 'my_file.txt'}):
    CRAWLED_FILE = os.path.join(SAVING_FOLDER, 'new_file.txt')
else:
    file = fs.find_one({'filename': 'my_file.txt'})
    CRAWLED_FILE = os.path.join(SAVING_FOLDER, 'new_file.txt')
    with open(CRAWLED_FILE, 'wb') as f:
        f.write(file.read())
    f.close()

我相信find_one 不允许我在新文件中写入之前存储在数据库中的文件内容。 f.write(file.read()) 在刚刚创建的文件 (new_file.txt) 中写入存储 (new_file.txt) 的目录!所以我有一个与我在数据库中上传的完全不同的txt,txt中唯一的一行是:E:\\my_folder\\sub_folder\\my_file.txt 这有点奇怪,我什至不知道为什么会这样。

我认为如果我使用fs.get(ObjectId(ID)) 方法可以工作,根据 Pymongo 和 GridFS 的官方文档,它提供了一个类似文件的读取界面。但是我只知道保存在数据库中的 txt 的名称,我不知道对象 ID 是什么,我不能使用列表或字典来存储我的文档的所有 ID,因为它不值得。我在 StackOverflow 上查看了很多帖子,每个人都建议使用订阅。基本上你使用fs.find()创建一个游标然后你可以像这样迭代游标:

for x in fs.find({'filename': 'my_file.txt'}):
    ID = x['_id']

看,这里的许多答案建议我执行以下操作,唯一的问题是 Cursor 对象不可下标,我不知道如何解决此问题。

我必须想办法在给定文档的文件名的情况下获取文档“_id”,以便以后可以将它与fs.get(ObjectId(ID))结合使用。

希望你能帮助我,非常感谢! 马特奥

【问题讨论】:

    标签: python pymongo information-retrieval gridfs


    【解决方案1】:

    你可以这样访问它:

    ID = x._id 
    

    但是“_”是 Python 中的受保护成员,所以我一直在寻找其他解决方案(找不到太多)。为了只获取 ID,您可以这样做:

    for ID in fs.find({'filename': 'my_file.txt'}).distinct('_id'):
        # do something with ID
    

    由于只获取 ID,您可能需要这样做:

    query = fs.find({'filename': 'my_file.txt'}).limit(1) # equivalent to find_one
    content = next(query, None) # Iterate GridOutCursor, should have either one element or None
    if content:
        ID = content._id
        ...
    

    【讨论】:

      猜你喜欢
      • 2011-01-15
      • 2015-10-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      相关资源
      最近更新 更多