使用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;
广告
将在 10 秒后关闭
bannerAds