如何使用xxx[dbname?]形式的mongoengine
How to use mongoengine in the form of xxx[dbname?]
通过使用 pymongo,我可以像这样连接到 collection:
conn = pymongo.MongoClient()
db = conn.example
collection = db.col
然后,我可以连接到名为 "example" 和 collection 的数据库,名为 "col"。
而且我还可以写出像blow这样的代码:
dbname = 'example'
collectionName = 'col'
conn = pymongo.MongoClient()
db = conn[dbname]
connection = db[collectionName]
这两个代码块将做同样的事情。
现在,我使用 mongoengine 连接到 MongoDB,我有一个带有 collectionA 的数据库,我在名为 [=37= 的文件中还有一个 class ]:
class collectionA(Document):
A=StringField()
B= StringField()
所以我只能使用:
import model
x = model.collectionA.object()
查询数据。
因为我有很多collection所以我想用
model[collectionName].object()
查询数据,但是抛出异常,好像mongoengine不支持model[xxx]的形式连接collections.
那么,有什么办法可以解决这个问题吗?
您正在将 model.py 作为模块导入。方括号语法是对象上 getitem
方法的 "shortcut" 。 Because everything in python is an object,包括模块,你得到一个 TypeError
因为模块没有 getitem
方法。
您尝试实现的目标可以使用 inspect
模块完成:
import inspect
import model
collections = dict(inspect.getmembers(model, inspect.isclass))
collections[collectionName].object()
现在可以工作了。
FWIW 这似乎不是很 pythonic,mongoengine 的强大之处在于您将文档映射到明确定义的 classes,这似乎有点混淆了。这使得引入 hard-to-find 错误变得非常容易,并且还需要额外的击键,因为每个 class 现在都被引用为一个字符串。
通过使用 pymongo,我可以像这样连接到 collection:
conn = pymongo.MongoClient()
db = conn.example
collection = db.col
然后,我可以连接到名为 "example" 和 collection 的数据库,名为 "col"。
而且我还可以写出像blow这样的代码:
dbname = 'example'
collectionName = 'col'
conn = pymongo.MongoClient()
db = conn[dbname]
connection = db[collectionName]
这两个代码块将做同样的事情。
现在,我使用 mongoengine 连接到 MongoDB,我有一个带有 collectionA 的数据库,我在名为 [=37= 的文件中还有一个 class ]:
class collectionA(Document):
A=StringField()
B= StringField()
所以我只能使用:
import model
x = model.collectionA.object()
查询数据。
因为我有很多collection所以我想用
model[collectionName].object()
查询数据,但是抛出异常,好像mongoengine不支持model[xxx]的形式连接collections.
那么,有什么办法可以解决这个问题吗?
您正在将 model.py 作为模块导入。方括号语法是对象上 getitem
方法的 "shortcut" 。 Because everything in python is an object,包括模块,你得到一个 TypeError
因为模块没有 getitem
方法。
您尝试实现的目标可以使用 inspect
模块完成:
import inspect
import model
collections = dict(inspect.getmembers(model, inspect.isclass))
collections[collectionName].object()
现在可以工作了。
FWIW 这似乎不是很 pythonic,mongoengine 的强大之处在于您将文档映射到明确定义的 classes,这似乎有点混淆了。这使得引入 hard-to-find 错误变得非常容易,并且还需要额外的击键,因为每个 class 现在都被引用为一个字符串。