The original issue reported that SCIM filtering on MongoDB was generating inefficient queries like:
{
"Attribute.SchemaAttributeId": "26d51050-4962-4348-a6cb-310c198eeee3",
"$expr": {
"$eq": [
{ "$toLower": { "$ifNull": ["$Attribute.ValueString", ""] } },
"150017355"
]
}
}This query pattern forced MongoDB into full collection scans because:
$exprwith$toLowerand$ifNullfunctions prevent index usage- MongoDB cannot use indexes when expressions involve function calls in
$expr - Large collections (859k documents) result in poor performance (~2.11 minutes)
The solution implements MongoDB-specific optimizations for case-insensitive string comparisons in the SCIM persistence layer.
- Optimized Expression Engine: New
MongoDbOptimizedExpressionExtensionsclass that generates regex-based queries instead of$exprqueries - Enhanced Indexes: Additional compound and case-insensitive collation indexes for better query performance
- Selective Optimization: Only case-insensitive string operations are optimized, preserving existing behavior for other data types
// Generated inefficient $expr query with $toLower/$ifNull
e1 = Expression.Coalesce(e1, Expression.Constant(string.Empty));
e1 = Expression.Call(e1, typeof(string).GetMethod("ToLower", System.Type.EmptyTypes));
e2 = Expression.Call(e2, typeof(string).GetMethod("ToLower", System.Type.EmptyTypes));
return Expression.Equal(e1, e2);// Uses regex patterns that can leverage MongoDB indexes
var regexPattern = $"^{Regex.Escape(value)}$";
var regex = new Regex(regexPattern, RegexOptions.IgnoreCase);
// MongoDB can use indexes for anchored regex patterns// Additional indexes for better performance
var schemaAttributeValueIndex = Builders<SCIMRepresentationAttribute>.IndexKeys
.Ascending(a => a.SchemaAttributeId)
.Ascending(a => a.ValueString);
var caseInsensitiveCollation = new Collation("en", strength: CollationStrength.Secondary);
var valueStringIndex = Builders<SCIMRepresentationAttribute>.IndexKeys
.Ascending(a => a.ValueString);The optimization specifically targets the query pattern that was causing performance issues:
- Query Type:
eventid eq "150017355"(case-insensitive equality) - Before: Full collection scan with
$exprfunctions - After: Index-supported regex pattern matching
- Index Usage: Leverages
SchemaAttributeId_1_ValueString_1compound index
- ✅ Existing case-sensitive queries unchanged
- ✅ Non-string attribute queries unchanged
- ✅ Complex attribute expressions unchanged
- ✅ All existing tests continue to pass
- ✅ Only optimizes problematic case-insensitive string operations
The optimization is automatically applied when:
- Using MongoDB persistence layer
- Filtering on string attributes with
CaseExact = false - Using equality (
eq), starts-with (sw), ends-with (ew), or contains (co) operations
No changes required in application code - the optimization is transparent to SCIM API consumers.