python mongoengine 映射到现有集合

2 投票
1 回答
1298 浏览
提问于 2025-04-18 09:10

我刚接触mongo引擎,对它的工作原理有点困惑,文档也不是特别容易理解。我在Mongo里已经有一个集合,每个文档都有一些字段。我把这些字段映射到了从文档类派生出的字段,并根据别名引用了集合。

class imported_item(me.Document):
    _id = me.ObjectIdField(required = True)
    _type = me.StringField(max_length=10)
    _name = me.StringField(max_length=10)

def item_print(self):
    print ("************************************************")
    print self._id
    print self._type
    print self._name

    me.meta = {
        'db_alias': 'test',
        'index_background': True,
        'indexes': [(_type, 1),(_name, 1)],
        }

  def main():
     me.register_connection(alias="test", name=_database, host=_host, port=_port, username=_username, password=_password)

     print imported_item.objects({imported_item._type:'sm_tags'})
     imported_item.item_print()

现在我遇到的问题是: 1) Mongoengine抱怨说需要默认连接,而不是我叫的test连接。我并不想这样,因为我会有多个集合,并且希望每个集合可以链接多个对象类型,这样我就可以并行处理它们。 2) 我在打印时看到一堆mongoengine.fields.StringField对象,但没有值。 3) 如果我尝试用imported_item.objects.all()来获取所有对象,结果却是一个空集合。

我之前用的是_mysql驱动,那种方式更像是过程导向,所以我不太明白数据库和mongoengine之间的连接到底是在什么层面上发生的,以及我该如何访问数据库里的值。

谢谢大家的帮助!

1 个回答

0

我不太确定你的示例代码缩进是否正确,不过我们来看看几个要点。

1) 你需要连接到一个数据库 - 你虽然注册了一个,但还没有连接上。你可以使用 get_connection 来通过别名获取连接。

from mongoengine.connection import get_connection
get_connection(alias)

2) 你的打印方法看起来没问题。不过,它需要在类的实例上调用 - 这不是一个静态方法 - 试试这样:

imported_item.objects({imported_item._type:'sm_tags'}).first().item_print()

3) 如果返回的是一个空集合,可能是因为你没有正确设置元数据 - 它应该是 Document 类的一个属性,而不是尝试设置 me.meta,例如:

meta = {
    'db_alias': 'test',
    'index_background': True,
    'indexes': [(_type, 1),(_name, 1)],
    }

最后,请参考 pep8 规范,确保你的语法符合 Python 的编码标准,这些标准在社区中是广泛接受的。

撰写回答