MongoEngine查询优化

时间:2015-08-30 19:01:24

标签: python mongoengine

我有两个集合ScenarioDriversModelDrivers,彼此之间存在一对多的关系。

class ScenarioDrivers(Document):
    meta = {
        'collection': 'ScenarioDrivers'
    }
    ScenarioId = ReferenceField('ModelScenarios')
    DriverId = ReferenceField('ModelDrivers')
    DriverCalibrationMethod = StringField()
    SegmentName = StringField()
    DriverValue = ListField()
    CalibrationStatus = StringField()
    AdjustedValues = ListField(default=[])
    CreateDate = DateTimeField(default=ObjectId().generation_time)
    LastUpdateDate = DateTimeField(default=datetime.utcnow())

class ModelDrivers(Document):
    meta = {
        'collection': 'ModelDrivers'
    }
    PortfolioModelId = ReferenceField('PortfolioModels')
    DriverName = StringField()
    CreateDate = DateTimeField(default=ObjectId().generation_time)
    LastUpdateDate = DateTimeField(default=datetime.utcnow())
    FieldFormat = StringField()
    DriverData = ListField()

我的查询是这样的。

class GetCalibratedDrivers(Resource):
    def get(self, scenario_id):
        scenario_drivers_list = []

        scenario_drivers = ScenarioDrivers.objects(ScenarioId=scenario_id).exclude('ScenarioId').select_related(1)
        for scenario_driver in scenario_drivers:
            scenario_driver_dict = {
                'id': str(scenario_driver.id),
                'DriverId': str(scenario_driver.DriverId.id),
                'SegmentName': scenario_driver.SegmentName,
                'CalibrationMethod': scenario_driver.DriverCalibrationMethod,
                'CalibratedValues': exchange(scenario_driver.DriverValue),
                'AdjustedValues': scenario_driver.AdjustedValues,
                'LastUpdateDate': formatted_date(scenario_driver.LastUpdateDate),
                'FieldFormat': scenario_driver.DriverId.FieldFormat
            }
            scenario_drivers_list.append(scenario_driver_dict)

        return {
            'DriverCalibrations': scenario_drivers_list
        }

查询匹配1140条记录,然后构建字典并将其作为列表。

但是此API调用需要30s来处理1140个记录。我失踪的地方?请帮忙。我正在使用最新版本的Pymongo和MongoEngine。

1 个答案:

答案 0 :(得分:0)

我认为问题不在于您的查询,而是在循环超过1140条记录。我没有看到任何引用对象的使用,因此您应该考虑删除select_related(1)。一旦你这样做,如果你想将引用对象id转换为字符串,你可以使用as_pymongo()默认为你做。最后,如果您必须阅读特定格式的某些数据,例如formatted_dateexchange,最好将它们保存为文档的一部分。即用FormattedLastUpdateDate保存LastUpdateDate。在MongoDB中,您必须在保存文档时考虑读取特定的逻辑。