Skip to content
FermionDB
Running in production at Rangin

Stop syncing your vector database.

FermionDB keeps every document and its embedding in one record, and searches both in one MongoDB query.

Works with pymongo, the Go driver and mongosh.

samurai armor with a horned helmet

  1. Armor (Gusoku)

    Armor (Gusoku)

    Hiromichi Miura, 1600–2015

    score 0.369

  2. Armor (Gusoku)

    Armor (Gusoku)

    Jo Michitaka, 1801–1900

    score 0.366

  3. Armor (Yoroi)

    Armor (Yoroi)

    1701–1800

    score 0.351

  4. Armor (Yoroi)

    Armor (Yoroi)

    1701–1800

    score 0.351

  5. Armor (Gusoku)

    Armor (Gusoku)

    Bamen Tomotsugu, 1701–1800

    score 0.347

  6. Armor (Yoroi)

    Armor (Yoroi)

    1300–1450

    score 0.346

11.2 ms to search 258,561 artworks from The MetSaved searches run on FermionDB. Images: The Met, public domain.

The problem

Two databases and a sync job, or one.

Most vector search keeps documents in one place and copies of their vectors in another.

The usual stack

Your appDocument DBthe recordsVector DBcopies of the vectorssync job, retries, driftwritewrite again

Every write happens twice. Search returns IDs you look up elsewhere.

FermionDB

Your appone write, one queryFermionDBdocument + vector, one recordnothing to keep in step

Write once. One query returns whole documents, filtered and ranked.

The product

A real database, with vector search inside.

Queries, indexes and aggregation work the way they do in MongoDB. The vector is just another field.

met.artworks258,561 documents
Irises at Yatsuhashi (Eight Bridges)

One record

Irises at Yatsuhashi (Eight Bridges)

Ogata Kōrin, 17101716

{
  _id: 39664,
  title: "Irises at Yatsuhashi (Eight Bridges)",
  artist: "Ogata Kōrin",
  department: "Asian Art",
  culture: "Japan",
  classification: "Paintings",
  begin_year: 1710,
  end_year: 1716,
  is_highlight: true,
  embedding: [0.0047, 0.0106, -0.0524, … 509 more]
}

Indexes

  • artworks_clip512 dims, cosinevector
  • department_1filters in searchB-tree
  • is_highlight_1filters in searchB-tree
  • _id_primaryB-tree

All indexes built from the same record

Search “a horse”, but only the Met's highlights.

Real searches filter: in stock, this store, this region. Here the filter keeps 1,740 of 258,561 artworks.

Search first, filter after

  1. 1Finds the 6 horses closest to the search
  2. 2Removes the ones that aren't highlights
  1. Horse (from Sketchbook)
  2. Measured Drawing of a Horse Facing Left (recto)
  3. Decorative plaque
  4. Portrait of a Stallion
  5. Horse, Fort Stanton, New Mexico
  6. Horse

Result: 0 horses

FermionDB

  1. 1Looks only at the 1,740 highlights
  2. 2Finds the closest horses among them
  1. Night-Shining White
  2. Whip Handle in the Shape of a Horse
  3. A Stallion
  4. Bronze horse
  5. Incense Burner of Amir Saif al-Dunya wa’l-Din ibn Muhammad al-Mawardi
  6. At the Circus: The Spanish Walk (Au Cirque: Le Pas espagnol)

Result: 6 horses in 3.1 ms

from pymongo import MongoClient
db = MongoClient(FERMION_URL)
db.shop.products.aggregate(…)

Speaks MongoDB

Connect with pymongo, the Go driver or mongosh. No new SDK to learn.

  1. $vectorSearch
  2. $match
  3. $lookup
  4. $project

One query, start to finish

Rank, join and shape results in the same aggregation pipeline.

from pymongo import MongoClient

db = MongoClient("mongodb://localhost:27017", directConnection=True)
art = db.met.artworks

art.aggregate([{"$vectorSearch": {
    "index": "artworks_clip", "path": "embedding",
    "queryVector": clip("samurai armor with a horned helmet"),
    "filter": {"department": "Arms and Armor"},
    "numCandidates": 200, "limit": 6,
}}])

$ output

connected to FermionDB

6 results in 11.2 ms

  1. 0.369Armor (Gusoku), Hiromichi Miura
  2. 0.366Armor (Gusoku), Jo Michitaka
  3. 0.351Armor (Yoroi)
  4. 0.351Armor (Yoroi)
  5. 0.347Armor (Gusoku), Bamen Tomotsugu
  6. 0.346Armor (Yoroi)

$

Performance

Built for filtered search.

Real apps rarely search everything. In stock, this store, this region: FermionDB filters inside the search.

  • 4.9×

    faster than pgvector

    4.0 ms vs 19.7 ms median search

  • 8×

    lower worst-case latency

    4.8 ms vs 38.3 ms for the slowest 1%

  • 100%

    of the true top 10 found

    pgvector's best: 97%

  • 1,372

    searches per second

    on one 8-core server, at full accuracy

Top-10 vector search over 180,031 Rangin products (1,408 dimensions) with a filter that matches 1,744 of them, 430 real shopper-style text queries, both engines held to at least 95% recall on the same dedicated server. pgvector 0.8.1 on PostgreSQL 17 with HNSW. Unfiltered searches favour pgvector.

Playground

Search 258,561 artworks. Right now.

The Met's open-access collection, live in FermionDB. Type anything, filter by department, see the query.

Dataset
Department
Collection

Customer story

Rangin finds the outfit. FermionDB finds it fast.

Rangin is a voice shopping assistant for Pakistani fashion. Shoppers describe what they want; FermionDB searches every store for it, in stock and in their region.

products
181,031
fashion brands
5
regional storefronts
12
dimensions per vector
1,408
Try rangin.ai

LAAM, Sapphire, J., Maria B and MTJ

The Rangin app showing trending outfits from Sapphire and Maria B

Pricing

Free while it's in preview.

Start in the browser. Bring your own data when you're ready.

PlaygroundLive now

Free

Search public datasets in your browser. No account.

Open the playground
SandboxComing soon

Free

Your own FermionDB for 30 minutes, with a shell in the browser.

Join the waitlist
DeveloperEarly access

Free in preview

A persistent instance for your data, an API key, and help getting started.

Request access
TeamDedicated

Talk to us

A dedicated instance and help moving from MongoDB or pgvector.

Contact us

FAQ

Questions, answered.

Is it ready for production?

It already runs Rangin's product search. FermionDB is in preview, and we're bringing teams on one at a time so each gets a hands-on setup.

Is this MongoDB?

No. FermionDB is its own database that speaks the MongoDB wire protocol, so MongoDB drivers and mongosh connect to it. It isn't affiliated with MongoDB, Inc.

Will my Atlas vector search queries work?

$vectorSearch takes the same shape: index, path, queryVector, numCandidates, limit and filter. It must be the first stage, and each collection has one vector index.

Where is it fastest?

Filtered search. When a filter narrows the search to a small slice of the data, FermionDB stays fast and complete. On unfiltered searches pgvector was faster in our tests.

Why the name?

Fermions are the particles that can't share a state. Your document and its vector live in one record, so they can't drift apart either.

Get FermionDB for your team.

Tell us what you're searching. We'll set you up with an instance during the preview.

  • Your own FermionDB instance
  • Help loading your data
  • A direct line to the engineers

Use your work address. Personal email providers are not accepted.