通过“文件名”检索GridFS文档的文档“\u id”

2024-04-26 01:21:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在从事一个项目,在该项目中,我必须使用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)的目录!因此,我有一个与我在数据库中上传的文本完全不同的文本,文本中唯一的一行是:E:\\my_folder\\sub_folder\\my_file.txt 这有点奇怪,我甚至不知道为什么会这样

我认为如果我使用fs.get(ObjectId(ID))方法就可以了,根据Pymongo和GridFS的官方文档,它提供了一个类似文件的阅读接口。然而,我只知道数据库中保存的txt的名称,我不知道对象ID是什么,我不能使用列表或dict来存储我文档的所有ID,因为它不值得。我在这里查阅了很多关于StackOverflow的帖子,每个人都建议使用subscription。基本上,您可以使用fs.find()创建一个游标,然后可以在游标上进行迭代,例如:

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

看,这里的许多答案建议我做以下工作,唯一的问题是游标对象不可下标,我不知道如何解决这个问题

给定文档的文件名,我必须找到获取文档“\u id”的方法,以便以后可以将其与fs.get(ObjectId(ID))结合使用

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


Tags: 文件文档文本txtid数据库newmy
1条回答
网友
1楼 · 发布于 2024-04-26 01:21:52

您可以这样访问它:

ID = x._id 

但是“\ux”在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
    ...

相关问题 更多 >