在 PyMongo 中使用字符串访问 MongoDB 集合

问题描述 投票:0回答:3

我尝试将 MongoDB 集合的名称存储在变量中并在查询中引用该名称。如果我指定不带引号的集合名称,我的查询将运行,但如果我将集合名称作为字符串放入变量中,我的查询将不会运行。

这是我正在尝试运行的。如前所述,当“x”替换为 P38 时,查询会生成结果,但不会生成当前形式的结果。

x = 'P38'

cursor = db.x.find({})

for item in cursor:
    print(item)

python database mongodb collections pymongo
3个回答
2
投票

使用

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)


1
投票

当您以这种方式获得

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
异常。


0
投票

嗯,你的 X 变量是一个字符串。它不是 MongoDB 集合对象。

当您调用 X.find() 时,您实际上是从字符串对象执行 .find() 方法,而不是从数据库集合中执行,这将导致 TypeError,因为字符串的 .find() 方法需要子字符串,而不是空字典.

如果您需要从 MongoDB 查询结果,您应该使用 MongoDB 对象,而不是将其转换为 Python 字符串对象。 Python 无法识别您这样做的意思,它将此对象视为字符串,并且不关心该字符串的值是否等于您的 MongoDB 对象类名称。

您想通过此实现什么目的?

© www.soinside.com 2019 - 2024. All rights reserved.