← Files MongoDB AtlasARCHIVED FILE
references/pattern-approximation.md
3.23 KB · Sep 30, 2026 · 22:47 UTC
---
title: "Approximation Pattern"
impact: MEDIUM
impactDescription: "Reduces write load by storing approximate values when exact real-time counts are not required"
tags: schema, patterns, approximation, computed, write-optimization
---
## Approximation Pattern
**Intentionally store approximate values to reduce write load when exact real-time counts are not required.** High-frequency counters (page views, trending scores, social media counters) that increment by +1 per event can create expensive per-event writes. The approximation pattern batches these increments, trading staleness for dramatically lower write volume.
**Incorrect (write to database on every event):**
```javascript
// Page view counter - writes to MongoDB on every single view
function recordPageView(articleId) {
db.articles.updateOne(
{ _id: articleId },
{
$inc: { viewCount: 1 },
$set: { lastViewedAt: new Date() }
}
)
}
// 1M page views/day = 1M database writes/day
// High write load for a counter that doesn't need real-time accuracy
```
**Correct (batch writes with threshold):**
The document stores an approximate count plus a sync timestamp. The application tracks counts in local memory (e.g. a `Map` keyed by article ID) and writes to the database only when the local counter crosses a threshold (e.g. every 100 views). At threshold=100 this yields ~100× fewer database writes.
The document includes `viewCount` (approximate — may lag by up to one threshold) and `lastSyncedAt`. When the local counter reaches the threshold, the application issues a single `$inc` by the threshold amount and updates `lastSyncedAt`. Unsynced local increments are lost on application restart.
**Tradeoffs:**
| Concern | Impact |
|---------|--------|
| Write reduction | ~100x fewer DB writes (at threshold=100) |
| Staleness | Up to `threshold` events behind |
| Accuracy | Approximate — never exact real-time |
| Crash safety | Unsynced local increments lost on restart |
**Difference from Computed Pattern:**
- **Computed Pattern**: pre-computes expensive aggregations, stores exact results
- **Approximation Pattern**: intentionally stores inexact values to reduce write frequency
Use Approximation when staleness is acceptable. Use Computed when exact values are needed but recalculating each time is too expensive.
**When NOT to use this pattern:**
- **Financial amounts, inventory counts**: Exact values required — approximation is unacceptable.
- **Low-frequency updates**: If counter changes rarely, approximation adds complexity without benefit.
- **Regulatory/audit requirements**: When exact counts are mandated.
## Verify with
### Check write frequency on counter fields
Use codebase if available, ask the user.
High count relative to read count on a specific field suggests approximation would help
```javascript
// Compare counter staleness
db.articles.aggregate([
{ $sort: { lastSyncedAt: 1 } },
{ $limit: 10 },
{ $project: {
title: 1,
viewCount: 1,
lastSyncedAt: 1,
staleness: { $subtract: ["$$NOW", "$lastSyncedAt"] }
}}
])
// Verify staleness is within acceptable bounds for your use case
```
Reference: [Use the Approximation Pattern](https://mongodb.com/docs/manual/data-modeling/design-patterns/computed-values/approximation-schema-pattern/)
SHA-256: 26591e42152104cc075bb3657e5e0082abcdeca642ef554e1cd3a6801767a7c6