使用mongo_fdw将MongoDB数据导入到PostgreSQL表中
总结
可以使用PostgreSQL的扩展功能FDW来与MongoDB的数据进行协作。通过使用mongo_fdw,将外部MongoDB的部分数据导入到PostgreSQL的表中。
环境
-
- PostgreSQL 14
-
- CentOS9 Stream(docker)
- MongoDB server 4.4.6
设置mongo_fdw
按照 GitHub 上的 README 进行编译和安装。
源代码使用 git clone 命令,放置在 /tmp 文件夹中。
安装mongo-c/json库
用以下命令执行从构建到安装的操作。
autogen.sh --with-master
然而,在每次遇到错误时,我不断安装以下内容。
dnf install wget
dnf install cmake
dnf install gcc
dnf install openssl
dnf install openssl-devel
dnf install rpm-build
dnf install ccache
安装mongo_fdw
设置环境变量后进行构建和安装。
假设在/tmp文件夹中下载代码并进行操作,设置PKG_CONFIG_PATH环境变量。设置LD_LIBRARY_PATH环境变量为libmongoc-1.0.so和libbson-1.0.so的安装路径。
export PKG_CONFIG_PATH=/tmp/mongo_fdw/mongo-c-driver/src/libmongoc/src:/tmp/mongo_fdw/mongo-c-driver/src/libbson/src
export LD_LIBRARY_PATH=/lib64:$LD_LIBRARY_PATH
export PATH=/usr/pgsql-14/bin/:$PATH
make USE_PGXS=1
make USE_PGXS=1 install
由於先前執行時出錯,我安裝了以下的東西,然後再次運行了make命令。
wget https://rpmfind.net/linux/centos-stream/9-stream/CRB/x86_64/os/Packages/perl-IPC-Run-20200505.0-6.el9.noarch.rpm
wget https://rpmfind.net/linux/centos-stream/9-stream/CRB/x86_64/os/Packages/perl-IO-Tty-1.16-4.el9.x86_64.rpm
rpm -ivh perl-IO-Tty-1.16-4.el9.x86_64.rpm
rpm -ivh perl-IPC-Run-20200505.0-6.el9.noarch.rpm
dnf install postgresql14-devel*
创建用于MongoDB连接的外部表
MongoDB的连接信息。
-
- 接続IP 192.168.11.4
-
- ポート 27017
-
- データベース webcam
-
- コレクション webcam
- ユーザ/パスワード webcam/webcam
数据格式
MongoDB添加了以下格式的数据。
(在此不对数据进行介绍,但其中包括一些网络摄像头信息,原始数据来自https://api.windy.com/webcams)
{
_id:string
id:string;
status: string;
title: string;
location : {
latitude: number;
longitude: number;
}
player : {
day:{
available:string;
link:string;
}
}
image : {
current : {
thumbnail:string;
}
};
};
连接 PostgreSQL 和 MongoDB
CREATE SERVER mongo_server FOREIGN DATA WRAPPER mongo_fdw OPTIONS (address '192.168.11.4', port '27017');
CREATE USER MAPPING FOR postgres SERVER mongo_server OPTIONS (username 'webcam', password 'webcam');
创建外部表
创建一个名为”webcam”的外部表。表格包含数据库MongoDB中数据的一部分,而不是全部数据。
CREATE FOREIGN TABLE webcam
(
_id name,
id text,
"player.day.link" text,
"image.current.thumbnail" text
)
SERVER mongo_server
OPTIONS (database 'webcam', collection 'webcam');
创建数据导入目标表
创建一个表,在PostgreSQL数据库中作为实际表,并导入指向缩略图的链接”image.current.thumbnail”。另外,在MongoDB中并不存在,但添加一个自定义列。
create table thumbnail_link(
link varchar(100),
download_flag integer default 0 );
执行导入
使用INSERT INTO语句将数据插入数据库。
INSERT INTO thumbnail_link (link) SELECT "image.current.thumbnail" FROM webcam;