我有两个集合ScenarioDrivers
和ModelDrivers
,彼此之间存在一对多的关系。
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。
答案 0 :(得分:0)
我认为问题不在于您的查询,而是在循环超过1140条记录。我没有看到任何引用对象的使用,因此您应该考虑删除select_related(1)
。一旦你这样做,如果你想将引用对象id转换为字符串,你可以使用as_pymongo()
默认为你做。最后,如果您必须阅读特定格式的某些数据,例如formatted_date
或exchange
,最好将它们保存为文档的一部分。即用FormattedLastUpdateDate
保存LastUpdateDate
。在MongoDB中,您必须在保存文档时考虑读取特定的逻辑。