Python 检索文档'_id';GridFS文档的';文件名';

Python 检索文档'_id';GridFS文档的';文件名';,python,pymongo,information-retrieval,gridfs,Python,Pymongo,Information Retrieval,Gridfs,我目前正在从事一个项目,在该项目中,我必须使用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'})

我目前正在从事一个项目,在该项目中,我必须使用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\u folder\\sub\u folder\\my\u 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']
ID = x._id 
看,这里的许多答案建议我做以下工作,唯一的问题是游标对象不可下标,我不知道如何解决这个问题

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

希望你能帮助我,非常感谢!
Matteo

您可以这样访问它:

for x in fs.find({'filename': 'my_file.txt'}):
    ID = x['_id']
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
    ...