我尝试将 MongoDB 集合的名称存储在变量中并在查询中引用该名称。如果我指定不带引号的集合名称,我的查询将运行,但如果我将集合名称作为字符串放入变量中,我的查询将不会运行。
这是我正在尝试运行的。如前所述,当“x”替换为 P38 时,查询会生成结果,但不会生成当前形式的结果。
x = 'P38'
cursor = db.x.find({})
for item in cursor:
print(item)
get_collection()
为:
x = 'P38'
collection = db.get_collection(x)
cursor = collection.find({})
# or directly
cursor = db.get_collection(x).find({})
当你这样做时
db.x.find({})
Mongo 将使用 x
作为集合名称。它不会替换 db.x.find
等用法中的“x 值”,因为 x
被用作 db
的属性。
db.x
相当于 db.get_collection("x")
,请注意引号。 x
是集合名称,而不是变量。
因此,如果您想要
db.get_collection("P38")
,则需要是 db.P38
或使用长形式的变量 x
--> db.get_collection(x)
当您以这种方式获得
Collection
时,您可以使用直接属性查找。 直接属性查找必须以正确的方式完成(即直接属性查找):
db.P38
Database.__getattr__()
[github] (即,它是用于属性查找的 dunder 方法)在引擎盖下使用字典查找(它使用 dunder 方法 Database.__getitem__()
[ github])。
我只需使用字典查找从
Collection
访问每个 Database
。
db["P38"]
这只是我的偏好。您仍然可以使用下面的示例按照您想要的方式进行属性查找:
col = getattr(db, "P38", None) #[1]
if col:
#•••Rest of code•••
[1] 请记住在获取属性时使用默认值,以避免引发
AttributeError
异常。
嗯,你的 X 变量是一个字符串。它不是 MongoDB 集合对象。
当您调用 X.find() 时,您实际上是从字符串对象执行 .find() 方法,而不是从数据库集合中执行,这将导致 TypeError,因为字符串的 .find() 方法需要子字符串,而不是空字典.
如果您需要从 MongoDB 查询结果,您应该使用 MongoDB 对象,而不是将其转换为 Python 字符串对象。 Python 无法识别您这样做的意思,它将此对象视为字符串,并且不关心该字符串的值是否等于您的 MongoDB 对象类名称。
您想通过此实现什么目的?