如何在MongoDB中按树种分组计算平均地理位置?
MongoDB按树种计算平均地理位置 问题修复
报错原因
你遇到的SyntaxError以及代码逻辑问题主要有3点:
- 语法错误:聚合操作符(如
$arrayElemAt)、自定义字段名(如first/last)在Python字典中必须作为字符串加引号,同时你写的管道阶段大括号不配对,直接触发Python语法解析错误。 - 阶段用错:
$match是过滤文档的阶段,不能用来拆分geo_point_2d数组提取经纬度,提取字段可以在分组阶段直接引用,或者用$addFields提前生成。 - 计算逻辑错误:
{'$avg': 1}的写法只会固定对数值1求平均,完全没有引用坐标字段,无法得到地理位置的平均值。
正确实现代码
from pymongo import MongoClient from utils import get_my_password, get_my_username from pprint import pprint client = MongoClient( host='127.0.0.1', port=27017, username=get_my_username(), password=get_my_password(), authSource='admin' ) db = client['paris'] col = db['trees'] # 聚合管道 pipeline = [ # 过滤缺失坐标的脏数据,避免计算异常 {"$match": { "geo_point_2d": {"$exists": True, "$type": "array", "$size": 2} }}, # 按树种分组,分别计算经纬度平均值 {"$group": { "_id": "$espece", "avg_lat": {"$avg": {"$arrayElemAt": ["$geo_point_2d", 0]}}, "avg_lng": {"$avg": {"$arrayElemAt": ["$geo_point_2d", 1]}} }}, # 格式化输出,和原字段格式保持一致,返回[平均纬度, 平均经度]的数组 {"$project": { "_id": 0, "tree_species": "$_id", "avg_geo_point_2d": ["$avg_lat", "$avg_lng"] }} ] result = list(col.aggregate(pipeline)) pprint(result)
补充说明
原集合中
geo_point_2d的存储顺序为纬度在前,经度在后,计算平均坐标后保持相同顺序即可,不需要调换位置。如果需要同时关联树种的法语名称等其他字段,可以在$group阶段用$first操作符取对应字段值即可。
内容的提问来源于stack exchange,提问作者Anastasia_data
相关产品推荐
相关产品推荐

