Pipeline stages and accumulators
Use the MongoDB aggregation stage reference for syntax and examples. This inventory lists Silt's 20 stage names and 18 group accumulator names, with supported operand forms and restrictions. Shared data and API limits are in MongoDB compatibility.
Implemented stages
These count aliases separately because they are distinct accepted Mongo stage names: $set/$addFields and $replaceRoot/$replaceWith.
Implemented group accumulators
Explicitly unimplemented
Stages include $setWindowFields, $graphLookup, $densify, $fill, $bucketAuto, $redact, $out, $merge, $geoNear, server/cluster metadata stages, Atlas search/vector/fusion stages, and other unlisted stages. No JS fallback exists.
Accumulators include $accumulator, $stdDevPop, $stdDevSamp, $median, $percentile, window-specific accumulators, and other unlisted accumulator names. Operator names shared with array expressions do not imply group-accumulator support; for example, an expression $concatArrays does not make the group accumulator $concatArrays available.
Also outside the current profile: BSON-only types, Decimal128, locale collation, timezone database semantics, MongoDB's full error codes/messages and resource limits, and exact query planner/index behavior. Optional native PCRE2 expressions are available when the extension is explicitly enabled. Primitive unsupported syntax is rejected before execution, including on an empty input. Some document-dependent semantic failures are deliberately raised inside SQLite and surface as its JSON validation error, rather than MongoDB's corresponding error code.
Performance limits
SQLite executes every stage, including nested-array projection and joins. Large or deeply nested pipelines remain subject to SQLite's parser, expression, bind-variable, and JSON nesting limits.
Compound-value sorts can require O(n²) ranking to preserve JSON ordering. Generated SQL for these semantic paths is substantially larger than simple scalar SQL. Use representative data to assess these costs.
Without an index-compatible foreign predicate, $lookup can scan the foreign collection for each local document. Group arrays, facets, and lookup output arrays are constructed within SQLite, so persistent storage does not bound the size of one returned document. Streaming the final cursor avoids collecting the entire result in JavaScript; toArray() collects the remaining rows explicitly.
Validation evidence
Pipeline tests and live MongoDB comparisons cover nested projection, arrays, field order, joins, compound sorting, and accumulator edge cases. Offline tests replay captured responses. See testing and compatibility evidence for fixture provenance and recorded results.
Remaining known compatibility caveats
Projection retains source order for included fields, puts _id first, and appends computed fields in specification order. Dedicated tests compare serialized field order against MongoDB; ordinary JavaScript deep equality alone would not catch these differences. More combinations of nested mixed inclusion/computation remain useful conformance work.
Sorting on multiple array-valued paths is deliberately rejected, even where MongoDB can derive a correlated compound key. Scalar/object compound sorts and a single multikey path with other scalar keys are tested.
Very large/deep pipelines can hit SQLite parser, expression depth, compound SELECT, bind-variable, or JSON nesting limits before MongoDB's corresponding limits.