参数_id是ObjectId对象而不是字符串

直接说具体的坑是:Pymongo中的很多函数,比如exists等,传入的参数id是ObjectId对象而不是id的字符串

发现并解决坑的具体过程:

此处,gridfs的官网文档:

gridfs – Tools for working with GridFS — PyMongo 3.6.1 documentation

exists(document_or_id=None, session=None, **kwargs)

函数来说,没有说明document_or_id是个特殊的ObjectId的这个类的实例,而其例子:

>>> fs.exists(file_id)
>>> fs.exists({"_id":file_id})
>>> fs.exists(_id=file_id)
>>> fs.exists({"filename": "mike.txt"})
>>> fs.exists(filename="mike.txt")

很容易让人误解就是普通的_id的值的字符串,比如:

"5abc96dfa4bc715f473f0297"

"ObjectId('5abc96dfa4bc715f473f0297')"

搞得尝试半天也无法正常执行,找不到本来已存在的文件。

幸亏:

django - Querying by "_id" doesn't return file in MongoDB in Python, using PyMongo - Stack Overflow

中解释的,对于pymongo

2.2版本之前:

from pymongo.objectid import ObjectId

2.2版本之后:

from bson.objectid import ObjectId

然后才能用于exists:

fileIdToDelete = '5abc8d77a4bc71563222d455'
fileObjectIdToDelete = ObjectId(fileIdToDelete)
if fsCollection.exists(fileObjectIdToDelete):
    fsCollection.delete(fileObjectIdToDelete)

并且注意到作者是2012年,6年前就回复了该答案,结果此处pymongo在6年后,都没有及时更新此内容,真是醉了。

希望mongodb的文档以后能及时更新啊。

results matching ""

    No results matching ""