You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:16:17