MST

星途 面试题库

面试题:MongoDB地理空间查询之高级难度

在一个包含大量兴趣点(POI)的MongoDB数据库中,每个POI文档包含名称、类别、地理位置信息。现在需要实现一个功能,查找某一类别的POI中,距离某用户当前位置最近的前10个POI,并按照距离排序返回。请详细说明数据库设计(索引等)以及实现该功能的代码逻辑(可以用伪代码或你熟悉的编程语言连接MongoDB实现)。
32.2万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

数据库设计

  1. 文档结构:假设POI文档结构如下:
{
    "_id": ObjectId("..."),
    "name": "POI名称",
    "category": "类别",
    "location": {
        "type": "Point",
        "coordinates": [经度, 纬度]
    }
}
  1. 索引:为了高效查询,在categorylocation字段上创建复合索引。在MongoDB中可以通过以下命令创建:
db.pois.createIndex({category: 1, location: "2dsphere"})

代码逻辑(以Python为例,使用pymongo库)

import pymongo
from bson.geospatial import Point
from pymongo.collection import Collection


def find_closest_pois(user_location: list, category: str, limit: int = 10):
    client = pymongo.MongoClient("mongodb://localhost:27017/")
    db = client["your_database"]
    pois_collection: Collection = db["pois"]

    query = {
        "category": category,
        "location": {
            "$near": {
                "$geometry": {
                    "type": "Point",
                    "coordinates": user_location
                },
                "$maxDistance": 1000000  # 可根据实际情况调整最大距离
            }
        }
    }

    result = pois_collection.find(query).sort([("$distance", pymongo.ASCENDING)]).limit(limit)

    closest_pois = list(result)
    client.close()
    return closest_pois


# 使用示例
user_location = [116.3975, 39.9087]  # 用户当前位置 [经度, 纬度]
category = "餐厅"
closest_pois = find_closest_pois(user_location, category)
for poi in closest_pois:
    print(poi)

上述代码实现了连接MongoDB数据库,查找指定类别且距离用户当前位置最近的前10个POI,并按距离升序返回。$near操作符用于指定查询距离某个点最近的文档,$maxDistance用于设置最大距离(单位为米,可按需调整)。