探索Databases for MongoDB的地理空间搜索功能
MongoDB's地理空间功能可让您高效地执行以地理位置为关键考虑因素的查询。 举例来说,想想你的日常生活中有多少与你或他人的位置有关。 最近的 Uber 出租车在哪里? 最近的中餐馆在哪里? 我的哪个朋友现在离我最近? 这些都是 Uber、Google搜索和 Whatsapp 等应用程序不断为客户解答的问题。
本教程将指导您完成以下步骤:将伦敦出租车的位置数据导入 Databases for MongoDB 数据库,然后以多种方式查询这些数据。
Databases for MongoDB 是一项付费服务,因此学习本教程将产生费用。
开始之前
在开始之前,请确保您具备以下条件:
- 一个 IBM Cloud 帐户。
- Terraform 用于部署基础架构。
获取 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 的实例,并获取连接到该实例的关键信息。
-
导航至克隆项目的 Terraform 文件夹。
cd ibm-mongodb-geospatial-queries/terraform
-
在该文件夹中,创建一个名为
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
文件包含您可能希望保密的变量。 -
使用以下命令安装基础架构
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
查询数据
您可以使用两个脚本来查询数据:
-
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_taxis
和vehicle_type
参数,以获得更多结果,或按汽车类型(如轿车、面包车、七座车、小客车)进行筛选。 请参阅以下示例。node find_by_point.js --longitude="-0.13" --latitude=50.3 --num_taxis=10 --vehicle_type=minibus
脚本使用 MongoDB 地理空间功能的
$near
运算符。 -
find_by_bounding_box.js
- 使用此脚本,您只需向它输入一个边界框,它就会返回该边界框内的最多五辆出租车,例如下面的示例:node find_by_bounding_box.js --topleftlat=51.5019647 --topleftlong=-0.1494702 --bottomrightlong=-0.1249548 --bottomrightlat=51.4881758
您还可以添加
num_taxis
和vehicle_type
参数。脚本使用 MongoDB 地理空间功能的
$geoWithin
运算符。
结论和今后的步骤
在本教程中,您使用了 Databases for MongoDB 实例来存储位置是重要因素的数据。 这些数据以 GeoJSON 对象的形式存储,这样就可以在 MongoDB 地理空间索引中对数据进行索引。 您可以使用这些索引来搜索数据,以获得离给定点或地理边界最近的结果。
您可以在 MongoDB 文档中了解更多地理空间搜索功能。
拆毁基础设施
您的 Databases for MongoDB 会产生费用。 完成本教程后,您可以进入项目的 terraform
目录,使用以下命令删除所有基础结构:
terraform destroy