IBM Cloud Docs
探索Databases for MongoDB的地理空间搜索功能

探索Databases for MongoDB的地理空间搜索功能

MongoDB's地理空间功能可让您高效地执行以地理位置为关键考虑因素的查询。 举例来说,想想你的日常生活中有多少与你或他人的位置有关。 最近的 Uber 出租车在哪里? 最近的中餐馆在哪里? 我的哪个朋友现在离我最近? 这些都是 Uber、Google搜索和 Whatsapp 等应用程序不断为客户解答的问题。

本教程将指导您完成以下步骤:将伦敦出租车的位置数据导入 Databases for MongoDB 数据库,然后以多种方式查询这些数据。

Databases for MongoDB 是一项付费服务,因此学习本教程将产生费用。

开始之前

在开始之前,请确保您具备以下条件:

获取 API 密钥,将基础架构部署到您的账户中

按照 这些步骤创建 IBM Cloud API 密钥,使 Terraform 能够将基础架构配置到您的账户中。 您最多可以创建 20 个 API 密钥。

出于安全原因,API 密钥仅在创建时才可复制或下载。 如果 API 密钥丢失,必须创建新的 API 密钥。

克隆项目

通过克隆 Github 公共仓库,获取所需代码的本地副本。 请使用以下命令:

git clone https://github.com/IBM/ibm-mongodb-geospatial-queries

向您的账户部署 Databases for MongoDB 实例

在此步骤中,您将部署 Databases for MongoDB 的实例,并获取连接到该实例的关键信息。

  1. 导航至克隆项目的 Terraform 文件夹。

    cd ibm-mongodb-geospatial-queries/terraform
    
  2. 在该文件夹中,创建一个名为 terraform.tfvars 的文档,其中包含以下字段:

    ibmcloud_api_key = "<your_api_key_from_step_1>"
    region = "<the IBM region where you will deploy the MongoDB database>"
    admin_password = "<the password of your mongodb admin user>"
    

    terraform.tfvars 文件包含您可能希望保密的变量。

  3. 使用以下命令安装基础架构

    terraform init
    terraform apply --auto-approve
    

上传出租车数据

上一步产生了访问数据库所需的两个元素:

  • 部署证书(cert)。您需要此证书才能安全地连接到数据库。 解码证书,将其保存到项目根目录下的文件中,并将文件名导出为环境变量。 您可以在终端上这样做:

    cd ..
    echo "<the_cert_from_the_output>" | base64 --decode > ca.cert
    export MONGO_CA_FILE="./ca.cert"
    
  • 访问部署的 url。 将该 URL 中的 $PASSWORD 参数替换为 terraform.tfvars 文件中的管理员密码。 然后,像这样从终端将其导出为环境变量:

    export MONGO_URL="<the_url_from_the_output>"
    

您可以上传数据了。 import.js 脚本使用名为 datamaker 的 Node 实用程序,以 taxi.json 文件中指定的格式生成大量随机数据,并将这些数据上传到 MongoDB 中。 该格式是标准的 GeoJSON 格式,MongDB 地理空间查询需要使用该格式。

脚本还会在数据的 geometry 字段上创建地理索引,该字段包含每辆车的坐标。 在这种情况下,您将创建一个 2dsphere 索引。

要运行脚本,请使用以下命令:

npm install --save  #install all required node packages, including datamaker and mongodb
node import.js

查询数据

您可以使用两个脚本来查询数据:

  1. find_by_point.js- 使用该脚本,您只需向它输入一对纬度/长度,它就会返回离该地点最近的出租车,如下例所示:

    node find_by_point.js --longitude="-0.13"  --latitude=50.3
    

    你会得到这样的回复

    {
      _id: new ObjectId('66bc7dd80fbd69a0f41c029b'),
      type: 'Feature',
      geometry: { type: 'Point', coordinates: [ -0.1002, 51.3611 ] },
      properties: {
        driver_name: 'Elisabeth Acuna',
        taxi_id: 'ECJK0AG87JB00991',
        vehicle_type: 'van',
        phone_number: '+352-1224-498-598',
        timestamp: '2024-08-14T09:50:16.884Z'
      }
    }
    

    您可以选择添加 num_taxisvehicle_type 参数,以获得更多结果,或按汽车类型(如轿车、面包车、七座车、小客车)进行筛选。 请参阅以下示例。

    node find_by_point.js --longitude="-0.13"  --latitude=50.3 --num_taxis=10 --vehicle_type=minibus
    

    脚本使用 MongoDB 地理空间功能的 $near 运算符

  2. find_by_bounding_box.js- 使用此脚本,您只需向它输入一个边界框,它就会返回该边界框内的最多五辆出租车,例如下面的示例:

    node find_by_bounding_box.js --topleftlat=51.5019647 --topleftlong=-0.1494702 --bottomrightlong=-0.1249548 --bottomrightlat=51.4881758
    

    您还可以添加 num_taxisvehicle_type 参数。

    脚本使用 MongoDB 地理空间功能的 $geoWithin 运算符

结论和今后的步骤

在本教程中,您使用了 Databases for MongoDB 实例来存储位置是重要因素的数据。 这些数据以 GeoJSON 对象的形式存储,这样就可以在 MongoDB 地理空间索引中对数据进行索引。 您可以使用这些索引来搜索数据,以获得离给定点或地理边界最近的结果。

您可以在 MongoDB 文档中了解更多地理空间搜索功能。

拆毁基础设施

您的 Databases for MongoDB 会产生费用。 完成本教程后,您可以进入项目的 terraform 目录,使用以下命令删除所有基础结构:

terraform destroy