如何以xxx [dbname?]的形式使用mongoengine

时间:2016-01-03 07:57:41

标签: python mongodb mongoengine

通过使用pymongo,我可以连接到这样的集合:

conn = pymongo.MongoClient()
db = conn.example
collection = db.col

然后,我可以连接到名为“example”的数据库和名为“col”的集合。

我还可以编写类似打击的代码:

dbname = 'example'
collectionName = 'col'
conn = pymongo.MongoClient()
db = conn[dbname]
connection = db[collectionName]

这两个代码块也会做同样的事情。

现在,我使用mongoengine连接到MongoDB,我有一个带collectionA的数据库,我在一个名为'model.py'的文件中也有一个类:

class collectionA(Document):
    A=StringField()
    B= StringField()

所以我只能使用:

import model
x = model.collectionA.object()

查询数据。

因为我有很多收藏品,所以我想使用

model[collectionName].object() 

查询数据,但它引发异常,似乎mongoengine不能支持模型[xxx]的形式来连接集合。

那么,有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您正在将model.py导入为模块。方括号语法是一个"快捷方式"到对象的getitem方法。 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的力量是你正在将文档映射到明确定义的类,这似乎有点混淆。这使得引入难以发现的错误变得非常容易,并且还需要额外的击键,因为现在每个类都被引用为字符串。