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

MongoDB查询:根据计算出的距离匹配文档获取价格

计算两地距离并从MongoDB查询对应价格方案

1. 计算两地地理位置距离

如果你的地理位置基于经纬度,最常用的是Haversine公式计算球面距离(单位可选千米/英里)。以下是Python实现示例:

import math

def calculate_distance(lat1, lon1, lat2, lon2):
    # 经纬度转弧度
    lat1_rad = math.radians(lat1)
    lon1_rad = math.radians(lon1)
    lat2_rad = math.radians(lat2)
    lon2_rad = math.radians(lon2)
    
    # Haversine公式核心计算
    dlon = lon2_rad - lon1_rad
    dlat = lat2_rad - lat1_rad
    a = math.sin(dlat/2)**2 + math.cos(lat1_rad) * math.cos(lat2_rad) * math.sin(dlon/2)**2
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
    earth_radius = 6371  # 地球半径(千米,换英里用3956)
    distance = earth_radius * c
    return round(distance, 2)

调用示例:

# 示例:北京(39.9042, 116.4074) 到 上海(31.2304, 121.4737)
distance = calculate_distance(39.9042, 116.4074, 31.2304, 121.4737)
print(f"两地距离: {distance} km")

2. 查询MongoDB匹配距离的价格文档

假设集合名为distance_pricing,计算出的目标距离为target_distance,直接通过范围条件匹配min_distance和max_distance即可:

MongoDB Shell 查询语句

db.distance_pricing.find({
    min_distance: { $lte: target_distance },
    max_distance: { $gte: target_distance }
}, { price: 1, _id: 0 })

Python pymongo 示例代码

from pymongo import MongoClient

client = MongoClient("mongodb://localhost:27017/")
db = client["your_database_name"]
collection = db["distance_pricing"]

target_distance = 1000  # 替换为实际计算出的距离
result = collection.find_one(
    {
        "min_distance": { "$lte": target_distance },
        "max_distance": { "$gte": target_distance }
    },
    { "price": 1, "_id": 0 }
)

if result:
    print(f"匹配价格: {result['price']}")
else:
    print("无匹配的价格记录")

关键注意事项

  • 确保min_distance/max_distance的单位和计算出的距离单位一致(如统一为千米)
  • 若存在重叠区间需获取所有匹配结果,用find()替代find_one()
  • 给min_distance和max_distance建立复合索引可提升查询效率:
    db.distance_pricing.createIndex({ min_distance: 1, max_distance: 1 })
    

内容的提问来源于stack exchange,提问作者Prerna Kakria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:10:04