A relational schema in documents
Every entity in its own collection, joined back together with $lookup on every request — all the cost of joins without the planner that makes them cheap.
[ Development ]
Schemaless doesn't mean design-less.
MongoDB is quick to start with because it lets you skip the schema. Two years later that shows up as slow aggregations, sixteen-megabyte documents and queries that scan every collection. I design the document model around how your application actually reads data, and fix the ones already in production.
Explain plans, not guesses · Tested on a copy first · Written findings
[ Why teams call ]
MongoDB is a good database. Most of the pain comes from a document model that made sense for the first version and nothing since.
Every entity in its own collection, joined back together with $lookup on every request — all the cost of joins without the planner that makes them cheap.
Unbounded arrays of comments, events or line items embedded in one document, heading toward the 16 MB limit and rewritten in full on every update.
Queries and aggregation pipelines with no supporting index, fine in development, reading millions of documents per request in production.
A self-hosted MongoDB bound to 0.0.0.0 with auth disabled, which is exactly what automated ransom scanners look for.
A replica set treated as a backup, which it is not — a bad delete replicates to every member within milliseconds.
MongoDB 4.x or early 5.0 out of support, drivers years behind, and an upgrade that has to step through each major version in turn.
[ How it works ]
The profiler, slow query log, index usage stats and a sample of real documents. You get a written list of what is slow, what is risky and what I would change first, with an estimate for each.
Indexes built in the background, pipelines rewritten, documents reshaped with scripted migrations — all rehearsed on a copy, then applied in reviewable steps.
Before-and-after explain output, the data model written down with the reasoning behind it, and a backup and restore procedure that has actually been tested.
[ What actually changes ]
New builds, rescues of existing apps and one-off reviews. Pick the part you need.
[ Example engagement ]
A Node.js and Mongoose API where one report pipeline scanned the full events collection. Reshaped the pipeline, added two compound indexes and bucketed the unbounded arrays.
Illustrative example of a typical engagement. Figures vary with the state of your systems and are not a guarantee of a specific outcome.
[ Free · no obligation ]
Describe the symptom and share an explain() output if you have one. You get an honest assessment of the cause and a fixed price to fix it properly.
[ Pricing ]
Tell me the number you have to work with. I'll tell you honestly what's achievable within it — and if it isn't enough, I'll say so before we start rather than halfway through.
Hourly rate $20/hoursmall jobs and ongoing work · fixed price for defined projects
Scope agreed in writing, price agreed in writing, before any work starts. No hourly creep and no invoice you haven't already approved.
For ongoing work — maintenance, monitoring, updates and small changes. Month to month, cancel whenever, no minimum term.
For a single bug, a short task or ongoing tweaks, where writing a full scope would cost more than simply doing the work. Billed in real time, reported in writing.
Budget too tight for the whole thing? I'll often suggest doing the highest-value part first and the rest later, rather than doing all of it badly.
[ Questions ]
Small or open-ended jobs — reviewing a slow query, checking security, answering a modeling question — are billed hourly at $20 per hour. Defined projects such as a migration, an upgrade or a new build get a fixed price agreed in writing before I start.
Often, yes. MongoDB suits data that is naturally document-shaped, varies in structure or is read as a whole. If your data is heavily relational and you are writing $lookup everywhere, PostgreSQL may serve you better, and I will say so rather than keep patching.
For most teams, Atlas. Backups, upgrades, monitoring and security defaults are handled for you, and the cost usually compares well with the engineering time self-hosting takes. Self-hosting makes sense at larger scale or with specific compliance or data-residency needs.
Probably not yet. A well-indexed replica set on sensible hardware handles far more than most applications need. Sharding adds real operational complexity, and a poor shard key is very hard to undo, so I only recommend it when the numbers call for it.
Yes, and quickly. Authentication on, network access restricted, TLS enabled, users given only the roles they need — and a check of the logs for signs the instance was already accessed.
Yes, in either direction. Moving to PostgreSQL means designing a relational schema from the documents, handling inconsistent fields and changing application queries. I run both side by side on a copy before cutover, so differences surface before your users see them.
Yes. Most MongoDB performance problems are fixed partly in the application — how queries are built, what gets populated, how connections are reused. I work in your repository and submit normal pull requests.
I work remotely with teams in the US, UK, Europe, Canada and Australia. Most work is asynchronous, and I overlap with your hours for calls and for any change that touches production.
[ Related services ]
[ Let's talk ]
Describe what you're building or what's going wrong. You'll get a straight answer on scope, cost and timeline — from the person who would actually do the work.