MongoDB into Apache Arrow with ADBC
MongoDB 7 + BI Connector 2.14 (MySQL 5.7.12 wire), read and written through adbcBridge — the ADBC driver that loads the database's ODBC driver — read-only on Linux, macOS arm64 and Windows x64. Everything below is the compatibility matrix's record for this row.
Status
PASS
PASS (BI Connector, MySQL wire 5.7.12; read-only) — no macOS build of mongosqld 2.14.x exists, the linux-arm64 build runs inside the mongo:7 arm64 container
PASS (BI Connector mongosqld v2.14.22 over mongo:7, MySQL wire 5.7.12; read-only; MySQL Connector/ODBC 26.7.1 + NO_SSPS=1; libssl 1.1 staged per the README) — with MySQL Connector/ODBC 26.7.1 the astral check passes; through 8.4.0 (the earlier Windows measurement) the same entry FAILED at that check only: héllo 🚀 stored byte-exact, read back as héllo ??? on every read path including pyodbc, because 8.4.0 substitutes ? for a non-BMP character before either C type sees it (SQL_C_CHAR and SQL_C_WCHAR both return 3f 3f 3f; CHARSET= makes no difference)
Driver and connection string
- ODBC driver
- MySQL Connector/ODBC 9.4 (MySQL wire)
- Wire
- MySQL wire
- adbcBridge
- 0.1.1 (release)
The connection string the matrix used, as the connection strings reference records it (MySQL wire); {drv} is the driver library or its name from odbcinst.ini, and the host, port and credentials are the test server's.
Driver={drv};Server=127.0.0.1;Port=13315;Database=adbc;User=adbc;NO_SSPS=1;{plugin_dir}
Python
import adbcbridge
# {drv}: the ODBC driver library (path), or its name from odbcinst.ini
conn = adbcbridge.connect(uri="Driver={drv};Server=127.0.0.1;Port=13315;Database=adbc;User=adbc;NO_SSPS=1;")
with conn.cursor() as cur:
cur.execute("SELECT * FROM my_table")
table = cur.fetch_arrow_table() # pyarrow.Table
Polars and pandas
import polars as pl, pandas as pd
df = pl.read_database("SELECT * FROM my_table", connection=conn) # Polars, Arrow-native
pdf = pd.read_sql("SELECT * FROM my_table", conn) # pandas 2.2+, ADBC connection
pip install adbcbridge brings the driver library; the MongoDB ODBC driver is installed the way its vendor documents, then named in Driver=. Rust, Go, C# and Java use the same connection string through their ADBC driver managers — see the docs.
What the matrix recorded
mongosqld presents MongoDB collections as SQL tables over the MySQL wire; a query engine on a DRDL schema: CREATE TABLE, INSERT and DROP TABLE answer 1105 … requires --writeMode, UPDATE/DELETE/TRUNCATE are not in the grammar at all, and --writeMode is refused together with a --schema path — so the two collections are loaded with mongosh and the entry runs the read side unchanged.
What this stack needed
- Driver quirk handled:
SQLColumnssegfaults inside Connector/ODBC on any table with aDECIMALcolumn -- mongosqld'sinformation_schemareports NULLNUMERIC_PRECISIONand the connector runsstrtol()on it -- soGetObjectsdescribes a zero-row SELECT instead (the existingno_sql_columnspath the Flight SQL driver takes, keyed onSQL_DBMS_VER); server side: the handshake also segfaults withoutPLUGIN_DIR=(mysql_native_password), andCOM_STMT_PREPAREis refused (NO_SSPS=1). - No binary type;
dis mappedtimestampby the entry's DRDL schema so it arrives as a midnight datetime (mongosqld does have a DATE SQL type: aSqlType: datecolumn is describedSQL_TYPE_DATE), decimals described asDECIMAL(65,20)so they read back as exact text,_idin everySELECT *; fetch 128k rows/s
Native ADBC driver, compared
MongoDB speaks the MySQL wire protocol, so the ADBC Driver Foundry's native MySQL ADBC driver (0.6.0) can be pointed at it too. On 2026-09-05 the same seven-step ADBC workload (connect, SELECT 1, DDL and inserts and a read, a 1,000-row adbc_ingest, table schema, catalog listing, read back) ran through both:
| Path | Result | First error |
|---|---|---|
| Native ADBC driver | fails at connect | IO: [MySQL] failed to ping database: Error 1043 (08S01): recv handshake response error: invalid connection att |
| adbcBridge over ODBC | ✓ all seven steps |
Where the native driver stops it is by design of that driver, not a defect of MongoDB; the full table for all 28 wire-compatible databases, with each first error, is in the note.