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
相关产品推荐
相关产品推荐

