MongoDB与Python聚合脚本报错:departure_airport需为累加器对象
问题
需要对MongoDB中名为flight_data的集合进行数据聚合处理,该集合包含航班号、起降机场、油耗、飞行距离等航班信息,文档结构示例如下:
{ "_id": ObjectId("3f94fb7faff0b71ae5e3cb8d"), "flight_number": "SWA4146", "departure_airport": "SNA", "arrival_airport": "SMF", "fuel_consumption_gallons": 700.4, "flight_distance_miles": 450 }
期望计算每条唯一航线的总油耗,并找出油耗最高的航线,输出格式如下:
{ "route": "SNA-SMF", "total_fuel_consumption_gallons": THE_CALCULATED_AMOUNT }, { "route": "SFO-ORD", "total_fuel_consumption_gallons": THE_CALCULATED_AMOUNT }
编写的Python脚本如下:
from pymongo import MongoClient client = MongoClient("mongodb://localhost:27017/") db = client["aviation_data"] collection = db["flight_data"] pipeline = [ { "$group": { "_id": { "departure_airport": "$departure_airport", "arrival_airport": "$arrival_airport" }, "total_fuel_consumption_gallons": { "$sum": "$fuel_consumption_gallons" } } }, { "$project": { "_id": 0, "route": { "$concat": ["$_id.departure_airport", "-", "$_id.arrival_airport"] }, "total_fuel_consumption_gallons": 1 } }, { "$sort": { "total_fuel_consumption_gallons": -1 } }, { "$limit": 5 } ] result = list(collection.aggregate(pipeline)) print(result)
运行脚本时出现错误:pymongo.errors.OperationFailure: The field 'departure_airport' must be an accumulator object
错误原因及修复方案
错误原因
该错误的核心是MongoDB版本兼容性问题:
- 在MongoDB 3.2及更早版本中,
$group阶段的_id字段不支持嵌套文档(即{"departure_airport": "$departure_airport", ...}这种结构),只能接受单一字段表达式或简单的字符串拼接,否则会将嵌套内的字段误判为需要累加器(accumulator)处理的字段,从而抛出该错误。
修复方案
有两种可行的修复方式:
方式1:提前拼接航线字符串作为分组ID
在$group阶段直接用$concat生成航线字符串作为_id,避免嵌套文档:
pipeline = [ { "$group": { "_id": { "$concat": ["$departure_airport", "-", "$arrival_airport"] }, "total_fuel_consumption_gallons": { "$sum": "$fuel_consumption_gallons" } } }, { "$project": { "_id": 0, "route": "$_id", "total_fuel_consumption_gallons": 1 } }, { "$sort": { "total_fuel_consumption_gallons": -1 } }, { "$limit": 5 } ]
方式2:升级MongoDB版本
如果业务允许,将MongoDB升级到3.4及以上版本,此时$group的_id支持嵌套文档结构,原脚本可直接正常运行。
内容的提问来源于stack exchange,提问作者user34290832492
相关产品推荐
相关产品推荐

