Skip to main content
 首页 » 编程设计

python之通过python mongoengine刷新mongodb集合结构

2025年05月04日2598°冷暖

我正在编写一个简单的 Flask 应用程序,唯一目的是学习 Python 和 MongoDB。

我已经设法达到定义所有集合的程度,并且 CRUD 操作通常可以正常工作。现在,我真正想了解的一件事是如何在更新其结构后刷新集合。例如,假设我有以下 model:

用户.py

class User(db.Document, UserMixin): 
    email            = db.StringField(required=True, unique=True) 
    password         = db.StringField(required=True) 
    active           = db.BooleanField() 
 
    first_name       = db.StringField(max_length=64, required=True) 
    last_name        = db.StringField(max_length=64, required=True) 
 
    registered_at    = db.DateTimeField(default=datetime.datetime.utcnow()) 
    confirmed        = db.BooleanField() 
    confirmed_at     = db.DateTimeField() 
 
    last_login_at    = db.DateTimeField() 
    current_login_at = db.DateTimeField() 
    last_login_ip    = db.StringField(max_length=45) 
    current_login_ip = db.StringField(max_length=45) 
    login_count      = db.IntField() 
 
    companies        = db.ListField(db.ReferenceField('Company'), default=[]) 
    roles            = db.ListField(db.ReferenceField(Role), default=[]) 
 
    meta = { 
        'indexes': [ 
            {'fields': ['email'], 'unique': True} 
        ] 
    } 

现在,我的 user 集合中已有条目,但我想将 companies 更改为:

company = db.ReferenceField('Company') 

如何在不关闭整个数据库的情况下刷新集合的结构?

我确实有一个 manage.py 脚本可以帮助我并提供一个 shell:

#!/usr/bin/python 
 
from flask.ext.script import Manager 
from flask.ext.script.commands import Shell 
 
from app import factory 
 
app = factory.create_app() 
 
manager = Manager(app) 
manager.add_command("shell", Shell(use_ipython=True)) 
 
# manager.add_command('run_tests', RunTests()) 
 
 
if __name__ == "__main__": 
    manager.run() 

我已经尝试了几个命令,根据我可以重新编译的信息和我的基本知识:

>>> from app.models import db, User 
>>> import mongoengine 
>>> mongoengine.Document(User) 
      field = iter(self._fields_ordered) 
      AttributeError: 'Document' object has no attribute '_fields_ordered' 
>>> mongoengine.Document(User).modify() # well, same result as above 

关于如何实现这一目标的任何指示?

更新

我问所有这些,因为我已经更新了我的 user.py 以匹配我的新请求,但是每当我与数据库本身交互时,因为表的结构没有刷新,我得到以下错误:

FieldDoesNotExist: The field 'companies' does not exist on the document 'User', referer: http://local.faqcolab.com/company

请您参考如下方法:

解决方案比我预期的要简单:

db.getCollection('user').update( 
    // query  
    {}, 
 
    // update  
    { 
        $rename: { 
            'companies': 'company' 
        } 
    }, 
 
    // options  
    { 
        "multi" : true,  // update all documents 
        "upsert" : false  // insert a new document, if no existing document match the query  
    } 
); 

每个 {} 的解释:

  • 第一个是空的,因为我想更新 user 集合中的所有文档。
  • 第二个包含$rename这是重命名我想要的字段的调用操作。
  • 最后包含要执行的查询的附加设置。