mongo-aggro 0.1.0__py3-none-any.whl → 0.2.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. mongo_aggro/__init__.py +400 -0
  2. mongo_aggro/accumulators.py +30 -12
  3. mongo_aggro/base.py +49 -9
  4. mongo_aggro/expressions/__init__.py +396 -0
  5. mongo_aggro/expressions/arithmetic.py +329 -0
  6. mongo_aggro/expressions/array.py +425 -0
  7. mongo_aggro/expressions/base.py +180 -0
  8. mongo_aggro/expressions/bitwise.py +84 -0
  9. mongo_aggro/expressions/comparison.py +161 -0
  10. mongo_aggro/expressions/conditional.py +117 -0
  11. mongo_aggro/expressions/date.py +665 -0
  12. mongo_aggro/expressions/encrypted.py +116 -0
  13. mongo_aggro/expressions/logical.py +72 -0
  14. mongo_aggro/expressions/object.py +122 -0
  15. mongo_aggro/expressions/set.py +150 -0
  16. mongo_aggro/expressions/size.py +48 -0
  17. mongo_aggro/expressions/string.py +365 -0
  18. mongo_aggro/expressions/trigonometry.py +283 -0
  19. mongo_aggro/expressions/type.py +205 -0
  20. mongo_aggro/expressions/variable.py +73 -0
  21. mongo_aggro/expressions/window.py +327 -0
  22. mongo_aggro/operators/__init__.py +65 -0
  23. mongo_aggro/operators/array.py +41 -0
  24. mongo_aggro/operators/base.py +15 -0
  25. mongo_aggro/operators/bitwise.py +81 -0
  26. mongo_aggro/operators/comparison.py +82 -0
  27. mongo_aggro/operators/element.py +32 -0
  28. mongo_aggro/operators/geo.py +171 -0
  29. mongo_aggro/operators/logical.py +111 -0
  30. mongo_aggro/operators/misc.py +102 -0
  31. mongo_aggro/operators/regex.py +25 -0
  32. mongo_aggro/stages/__init__.py +110 -0
  33. mongo_aggro/stages/array.py +69 -0
  34. mongo_aggro/stages/change.py +109 -0
  35. mongo_aggro/stages/core.py +170 -0
  36. mongo_aggro/stages/geo.py +93 -0
  37. mongo_aggro/stages/group.py +154 -0
  38. mongo_aggro/stages/join.py +221 -0
  39. mongo_aggro/stages/misc.py +45 -0
  40. mongo_aggro/stages/output.py +136 -0
  41. mongo_aggro/stages/search.py +315 -0
  42. mongo_aggro/stages/session.py +111 -0
  43. mongo_aggro/stages/stats.py +152 -0
  44. mongo_aggro/stages/transform.py +136 -0
  45. mongo_aggro/stages/window.py +139 -0
  46. mongo_aggro-0.2.2.dist-info/METADATA +193 -0
  47. mongo_aggro-0.2.2.dist-info/RECORD +49 -0
  48. {mongo_aggro-0.1.0.dist-info → mongo_aggro-0.2.2.dist-info}/WHEEL +1 -1
  49. mongo_aggro/operators.py +0 -247
  50. mongo_aggro/stages.py +0 -990
  51. mongo_aggro-0.1.0.dist-info/METADATA +0 -537
  52. mongo_aggro-0.1.0.dist-info/RECORD +0 -9
  53. {mongo_aggro-0.1.0.dist-info → mongo_aggro-0.2.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,396 @@
1
+ """MongoDB expression operators for aggregation pipelines.
2
+
3
+ This package provides expression operators organized by category:
4
+ - arithmetic: Math operators ($add, $subtract, $multiply, etc.)
5
+ - array: Array manipulation ($size, $slice, $filter, $map, etc.)
6
+ - bitwise: Bitwise operations ($bitAnd, $bitOr, $bitXor, $bitNot)
7
+ - comparison: Comparisons ($eq, $ne, $gt, $gte, $lt, $lte, $cmp)
8
+ - conditional: Conditionals ($cond, $ifNull, $switch)
9
+ - date: Date operations ($dateAdd, $year, $month, etc.)
10
+ - encrypted: Encrypted string operations
11
+ - logical: Boolean logic ($and, $or, $not)
12
+ - object: Object manipulation ($mergeObjects, $getField, etc.)
13
+ - set: Set operations ($setUnion, $setIntersection, etc.)
14
+ - size: Data size ($bsonSize, $binarySize)
15
+ - string: String operations ($concat, $split, $toLower, etc.)
16
+ - trigonometry: Trig functions ($sin, $cos, $tan, etc.)
17
+ - type: Type conversion ($toString, $toInt, $type, etc.)
18
+ - variable: Variables ($let, $literal, $rand)
19
+ - window: Window functions ($rank, $shift, etc.)
20
+ """
21
+
22
+ # Base classes
23
+ # Arithmetic operators
24
+ from mongo_aggro.expressions.arithmetic import (
25
+ AbsExpr,
26
+ AddExpr,
27
+ CeilExpr,
28
+ DivideExpr,
29
+ ExpExpr,
30
+ FloorExpr,
31
+ LnExpr,
32
+ Log10Expr,
33
+ LogExpr,
34
+ ModExpr,
35
+ MultiplyExpr,
36
+ PowExpr,
37
+ RoundExpr,
38
+ SqrtExpr,
39
+ SubtractExpr,
40
+ TruncExpr,
41
+ )
42
+
43
+ # Array operators
44
+ from mongo_aggro.expressions.array import (
45
+ ArrayElemAtExpr,
46
+ ArraySizeExpr,
47
+ ConcatArraysExpr,
48
+ FilterExpr,
49
+ FirstNExpr,
50
+ InArrayExpr,
51
+ IndexOfArrayExpr,
52
+ IsArrayExpr,
53
+ LastNExpr,
54
+ MapExpr,
55
+ MaxNExpr,
56
+ MinNExpr,
57
+ RangeExpr,
58
+ ReduceExpr,
59
+ ReverseArrayExpr,
60
+ SliceExpr,
61
+ SortArrayExpr,
62
+ )
63
+ from mongo_aggro.expressions.base import ExpressionBase, F, Field
64
+
65
+ # Bitwise operators
66
+ from mongo_aggro.expressions.bitwise import (
67
+ BitAndExpr,
68
+ BitNotExpr,
69
+ BitOrExpr,
70
+ BitXorExpr,
71
+ )
72
+
73
+ # Comparison operators
74
+ from mongo_aggro.expressions.comparison import (
75
+ CmpExpr,
76
+ EqExpr,
77
+ GteExpr,
78
+ GtExpr,
79
+ LteExpr,
80
+ LtExpr,
81
+ NeExpr,
82
+ )
83
+
84
+ # Conditional operators
85
+ from mongo_aggro.expressions.conditional import (
86
+ CondExpr,
87
+ IfNullExpr,
88
+ SwitchBranch,
89
+ SwitchExpr,
90
+ )
91
+
92
+ # Date operators
93
+ from mongo_aggro.expressions.date import (
94
+ DateAddExpr,
95
+ DateDiffExpr,
96
+ DateFromPartsExpr,
97
+ DateFromStringExpr,
98
+ DateSubtractExpr,
99
+ DateToPartsExpr,
100
+ DateToStringExpr,
101
+ DateTruncExpr,
102
+ DayOfMonthExpr,
103
+ DayOfWeekExpr,
104
+ DayOfYearExpr,
105
+ HourExpr,
106
+ IsoDayOfWeekExpr,
107
+ IsoWeekExpr,
108
+ IsoWeekYearExpr,
109
+ MillisecondExpr,
110
+ MinuteExpr,
111
+ MonthExpr,
112
+ SecondExpr,
113
+ ToDateExpr,
114
+ WeekExpr,
115
+ YearExpr,
116
+ )
117
+
118
+ # Encrypted string operators
119
+ from mongo_aggro.expressions.encrypted import (
120
+ EncStrContainsExpr,
121
+ EncStrEndsWithExpr,
122
+ EncStrNormalizedEqExpr,
123
+ EncStrStartsWithExpr,
124
+ )
125
+
126
+ # Logical operators
127
+ from mongo_aggro.expressions.logical import AndExpr, NotExpr, OrExpr
128
+
129
+ # Object operators
130
+ from mongo_aggro.expressions.object import (
131
+ ArrayToObjectExpr,
132
+ GetFieldExpr,
133
+ MergeObjectsExpr,
134
+ ObjectToArrayExpr,
135
+ SetFieldExpr,
136
+ )
137
+
138
+ # Set operators
139
+ from mongo_aggro.expressions.set import (
140
+ AllElementsTrueExpr,
141
+ AnyElementTrueExpr,
142
+ SetDifferenceExpr,
143
+ SetEqualsExpr,
144
+ SetIntersectionExpr,
145
+ SetIsSubsetExpr,
146
+ SetUnionExpr,
147
+ )
148
+
149
+ # Size operators
150
+ from mongo_aggro.expressions.size import BinarySizeExpr, BsonSizeExpr
151
+
152
+ # String operators
153
+ from mongo_aggro.expressions.string import (
154
+ ConcatExpr,
155
+ LTrimExpr,
156
+ RegexFindAllExpr,
157
+ RegexFindExpr,
158
+ RegexMatchExpr,
159
+ ReplaceAllExpr,
160
+ ReplaceOneExpr,
161
+ RTrimExpr,
162
+ SplitExpr,
163
+ StrCaseCmpExpr,
164
+ StrLenCPExpr,
165
+ SubstrCPExpr,
166
+ ToLowerExpr,
167
+ ToUpperExpr,
168
+ TrimExpr,
169
+ )
170
+
171
+ # Trigonometry operators
172
+ from mongo_aggro.expressions.trigonometry import (
173
+ AcosExpr,
174
+ AcoshExpr,
175
+ AsinExpr,
176
+ AsinhExpr,
177
+ Atan2Expr,
178
+ AtanExpr,
179
+ AtanhExpr,
180
+ CosExpr,
181
+ CoshExpr,
182
+ DegreesToRadiansExpr,
183
+ RadiansToDegreesExpr,
184
+ SinExpr,
185
+ SinhExpr,
186
+ TanExpr,
187
+ TanhExpr,
188
+ )
189
+
190
+ # Type operators
191
+ from mongo_aggro.expressions.type import (
192
+ ConvertExpr,
193
+ IsNumberExpr,
194
+ ToBoolExpr,
195
+ ToDecimalExpr,
196
+ ToDoubleExpr,
197
+ ToIntExpr,
198
+ ToLongExpr,
199
+ ToObjectIdExpr,
200
+ ToStringExpr,
201
+ TypeExpr,
202
+ )
203
+
204
+ # Variable operators
205
+ from mongo_aggro.expressions.variable import LetExpr, LiteralExpr, RandExpr
206
+
207
+ # Window operators
208
+ from mongo_aggro.expressions.window import (
209
+ BottomExpr,
210
+ BottomNWindowExpr,
211
+ CovariancePopExpr,
212
+ CovarianceSampExpr,
213
+ DenseRankExpr,
214
+ DerivativeExpr,
215
+ DocumentNumberExpr,
216
+ ExpMovingAvgExpr,
217
+ IntegralExpr,
218
+ LinearFillExpr,
219
+ LocfExpr,
220
+ RankExpr,
221
+ ShiftExpr,
222
+ TopExpr,
223
+ TopNWindowExpr,
224
+ )
225
+
226
+ __all__ = [
227
+ # Base
228
+ "Field",
229
+ "F",
230
+ "ExpressionBase",
231
+ # Comparison
232
+ "EqExpr",
233
+ "NeExpr",
234
+ "GtExpr",
235
+ "GteExpr",
236
+ "LtExpr",
237
+ "LteExpr",
238
+ "CmpExpr",
239
+ # Logical
240
+ "AndExpr",
241
+ "OrExpr",
242
+ "NotExpr",
243
+ # Arithmetic
244
+ "AddExpr",
245
+ "SubtractExpr",
246
+ "MultiplyExpr",
247
+ "DivideExpr",
248
+ "AbsExpr",
249
+ "ModExpr",
250
+ "CeilExpr",
251
+ "FloorExpr",
252
+ "RoundExpr",
253
+ "TruncExpr",
254
+ "SqrtExpr",
255
+ "PowExpr",
256
+ "ExpExpr",
257
+ "LnExpr",
258
+ "Log10Expr",
259
+ "LogExpr",
260
+ # Conditional
261
+ "CondExpr",
262
+ "IfNullExpr",
263
+ "SwitchBranch",
264
+ "SwitchExpr",
265
+ # String
266
+ "ConcatExpr",
267
+ "SplitExpr",
268
+ "ToLowerExpr",
269
+ "ToUpperExpr",
270
+ "TrimExpr",
271
+ "LTrimExpr",
272
+ "RTrimExpr",
273
+ "ReplaceOneExpr",
274
+ "ReplaceAllExpr",
275
+ "RegexMatchExpr",
276
+ "RegexFindExpr",
277
+ "RegexFindAllExpr",
278
+ "SubstrCPExpr",
279
+ "StrLenCPExpr",
280
+ "StrCaseCmpExpr",
281
+ # Array
282
+ "ArraySizeExpr",
283
+ "SliceExpr",
284
+ "FilterExpr",
285
+ "MapExpr",
286
+ "ReduceExpr",
287
+ "ArrayElemAtExpr",
288
+ "ConcatArraysExpr",
289
+ "InArrayExpr",
290
+ "IndexOfArrayExpr",
291
+ "IsArrayExpr",
292
+ "ReverseArrayExpr",
293
+ "SortArrayExpr",
294
+ "RangeExpr",
295
+ "FirstNExpr",
296
+ "LastNExpr",
297
+ "MaxNExpr",
298
+ "MinNExpr",
299
+ # Date
300
+ "DateAddExpr",
301
+ "DateSubtractExpr",
302
+ "DateDiffExpr",
303
+ "DateToStringExpr",
304
+ "DateFromStringExpr",
305
+ "ToDateExpr",
306
+ "YearExpr",
307
+ "MonthExpr",
308
+ "DayOfMonthExpr",
309
+ "DayOfWeekExpr",
310
+ "DayOfYearExpr",
311
+ "HourExpr",
312
+ "MinuteExpr",
313
+ "SecondExpr",
314
+ "MillisecondExpr",
315
+ "WeekExpr",
316
+ "IsoWeekExpr",
317
+ "IsoWeekYearExpr",
318
+ "IsoDayOfWeekExpr",
319
+ "DateFromPartsExpr",
320
+ "DateToPartsExpr",
321
+ "DateTruncExpr",
322
+ # Type
323
+ "ToStringExpr",
324
+ "ToIntExpr",
325
+ "ToDoubleExpr",
326
+ "ToBoolExpr",
327
+ "ToObjectIdExpr",
328
+ "ToLongExpr",
329
+ "ToDecimalExpr",
330
+ "ConvertExpr",
331
+ "TypeExpr",
332
+ "IsNumberExpr",
333
+ # Set
334
+ "SetUnionExpr",
335
+ "SetIntersectionExpr",
336
+ "SetDifferenceExpr",
337
+ "SetEqualsExpr",
338
+ "SetIsSubsetExpr",
339
+ "AnyElementTrueExpr",
340
+ "AllElementsTrueExpr",
341
+ # Object
342
+ "MergeObjectsExpr",
343
+ "ObjectToArrayExpr",
344
+ "ArrayToObjectExpr",
345
+ "GetFieldExpr",
346
+ "SetFieldExpr",
347
+ # Variable
348
+ "LetExpr",
349
+ "LiteralExpr",
350
+ "RandExpr",
351
+ # Trigonometry
352
+ "SinExpr",
353
+ "CosExpr",
354
+ "TanExpr",
355
+ "AsinExpr",
356
+ "AcosExpr",
357
+ "AtanExpr",
358
+ "Atan2Expr",
359
+ "SinhExpr",
360
+ "CoshExpr",
361
+ "TanhExpr",
362
+ "AsinhExpr",
363
+ "AcoshExpr",
364
+ "AtanhExpr",
365
+ "DegreesToRadiansExpr",
366
+ "RadiansToDegreesExpr",
367
+ # Bitwise
368
+ "BitAndExpr",
369
+ "BitOrExpr",
370
+ "BitXorExpr",
371
+ "BitNotExpr",
372
+ # Size
373
+ "BsonSizeExpr",
374
+ "BinarySizeExpr",
375
+ # Window
376
+ "RankExpr",
377
+ "DenseRankExpr",
378
+ "DocumentNumberExpr",
379
+ "ShiftExpr",
380
+ "ExpMovingAvgExpr",
381
+ "DerivativeExpr",
382
+ "IntegralExpr",
383
+ "CovariancePopExpr",
384
+ "CovarianceSampExpr",
385
+ "LinearFillExpr",
386
+ "LocfExpr",
387
+ "TopExpr",
388
+ "BottomExpr",
389
+ "TopNWindowExpr",
390
+ "BottomNWindowExpr",
391
+ # Encrypted
392
+ "EncStrContainsExpr",
393
+ "EncStrStartsWithExpr",
394
+ "EncStrEndsWithExpr",
395
+ "EncStrNormalizedEqExpr",
396
+ ]
@@ -0,0 +1,329 @@
1
+ """Arithmetic expression operators for MongoDB aggregation."""
2
+
3
+ from typing import Any
4
+
5
+ from pydantic import model_serializer
6
+
7
+ from mongo_aggro.base import serialize_value
8
+ from mongo_aggro.expressions.base import ExpressionBase
9
+
10
+
11
+ class AddExpr(ExpressionBase):
12
+ """
13
+ $add expression operator - adds numbers or dates.
14
+
15
+ Example:
16
+ >>> AddExpr(operands=[F("price"), F("tax")]).model_dump()
17
+ {"$add": ["$price", "$tax"]}
18
+ """
19
+
20
+ operands: list[Any]
21
+
22
+ @model_serializer
23
+ def serialize(self) -> dict[str, Any]:
24
+ """Serialize to MongoDB $add expression."""
25
+ return {"$add": [serialize_value(o) for o in self.operands]}
26
+
27
+
28
+ class SubtractExpr(ExpressionBase):
29
+ """
30
+ $subtract expression operator - subtracts two numbers or dates.
31
+
32
+ Example:
33
+ >>> SubtractExpr(left=F("total"), right=F("discount")).model_dump()
34
+ {"$subtract": ["$total", "$discount"]}
35
+ """
36
+
37
+ left: Any
38
+ right: Any
39
+
40
+ @model_serializer
41
+ def serialize(self) -> dict[str, Any]:
42
+ """Serialize to MongoDB $subtract expression."""
43
+ return {
44
+ "$subtract": [
45
+ serialize_value(self.left),
46
+ serialize_value(self.right),
47
+ ]
48
+ }
49
+
50
+
51
+ class MultiplyExpr(ExpressionBase):
52
+ """
53
+ $multiply expression operator - multiplies numbers.
54
+
55
+ Example:
56
+ >>> MultiplyExpr(operands=[F("price"), F("qty")]).model_dump()
57
+ {"$multiply": ["$price", "$qty"]}
58
+ """
59
+
60
+ operands: list[Any]
61
+
62
+ @model_serializer
63
+ def serialize(self) -> dict[str, Any]:
64
+ """Serialize to MongoDB $multiply expression."""
65
+ return {"$multiply": [serialize_value(o) for o in self.operands]}
66
+
67
+
68
+ class DivideExpr(ExpressionBase):
69
+ """
70
+ $divide expression operator - divides two numbers.
71
+
72
+ Example:
73
+ >>> DivideExpr(dividend=F("total"), divisor=F("count")).model_dump()
74
+ {"$divide": ["$total", "$count"]}
75
+ """
76
+
77
+ dividend: Any
78
+ divisor: Any
79
+
80
+ @model_serializer
81
+ def serialize(self) -> dict[str, Any]:
82
+ """Serialize to MongoDB $divide expression."""
83
+ return {
84
+ "$divide": [
85
+ serialize_value(self.dividend),
86
+ serialize_value(self.divisor),
87
+ ]
88
+ }
89
+
90
+
91
+ class AbsExpr(ExpressionBase):
92
+ """
93
+ $abs expression operator - returns absolute value.
94
+
95
+ Example:
96
+ >>> AbsExpr(value=F("balance")).model_dump()
97
+ {"$abs": "$balance"}
98
+ """
99
+
100
+ value: Any
101
+
102
+ @model_serializer
103
+ def serialize(self) -> dict[str, Any]:
104
+ """Serialize to MongoDB $abs expression."""
105
+ return {"$abs": serialize_value(self.value)}
106
+
107
+
108
+ class ModExpr(ExpressionBase):
109
+ """
110
+ $mod expression operator - returns remainder of division.
111
+
112
+ Example:
113
+ >>> ModExpr(dividend=F("num"), divisor=2).model_dump()
114
+ {"$mod": ["$num", 2]}
115
+ """
116
+
117
+ dividend: Any
118
+ divisor: Any
119
+
120
+ @model_serializer
121
+ def serialize(self) -> dict[str, Any]:
122
+ """Serialize to MongoDB $mod expression."""
123
+ return {
124
+ "$mod": [
125
+ serialize_value(self.dividend),
126
+ serialize_value(self.divisor),
127
+ ]
128
+ }
129
+
130
+
131
+ class CeilExpr(ExpressionBase):
132
+ """
133
+ $ceil expression operator - rounds up to nearest integer.
134
+
135
+ Example:
136
+ >>> CeilExpr(input=F("value")).model_dump()
137
+ {"$ceil": "$value"}
138
+ """
139
+
140
+ input: Any
141
+
142
+ @model_serializer
143
+ def serialize(self) -> dict[str, Any]:
144
+ """Serialize to MongoDB $ceil expression."""
145
+ return {"$ceil": serialize_value(self.input)}
146
+
147
+
148
+ class FloorExpr(ExpressionBase):
149
+ """
150
+ $floor expression operator - rounds down to nearest integer.
151
+
152
+ Example:
153
+ >>> FloorExpr(input=F("value")).model_dump()
154
+ {"$floor": "$value"}
155
+ """
156
+
157
+ input: Any
158
+
159
+ @model_serializer
160
+ def serialize(self) -> dict[str, Any]:
161
+ """Serialize to MongoDB $floor expression."""
162
+ return {"$floor": serialize_value(self.input)}
163
+
164
+
165
+ class RoundExpr(ExpressionBase):
166
+ """
167
+ $round expression operator - rounds to specified decimal place.
168
+
169
+ Example:
170
+ >>> RoundExpr(input=F("value"), place=2).model_dump()
171
+ {"$round": ["$value", 2]}
172
+ """
173
+
174
+ input: Any
175
+ place: int = 0
176
+
177
+ @model_serializer
178
+ def serialize(self) -> dict[str, Any]:
179
+ """Serialize to MongoDB $round expression."""
180
+ return {"$round": [serialize_value(self.input), self.place]}
181
+
182
+
183
+ class TruncExpr(ExpressionBase):
184
+ """
185
+ $trunc expression operator - truncates to specified decimal place.
186
+
187
+ Example:
188
+ >>> TruncExpr(input=F("value"), place=2).model_dump()
189
+ {"$trunc": ["$value", 2]}
190
+ """
191
+
192
+ input: Any
193
+ place: int = 0
194
+
195
+ @model_serializer
196
+ def serialize(self) -> dict[str, Any]:
197
+ """Serialize to MongoDB $trunc expression."""
198
+ return {"$trunc": [serialize_value(self.input), self.place]}
199
+
200
+
201
+ class SqrtExpr(ExpressionBase):
202
+ """
203
+ $sqrt expression operator - calculates square root.
204
+
205
+ Example:
206
+ >>> SqrtExpr(input=F("value")).model_dump()
207
+ {"$sqrt": "$value"}
208
+ """
209
+
210
+ input: Any
211
+
212
+ @model_serializer
213
+ def serialize(self) -> dict[str, Any]:
214
+ """Serialize to MongoDB $sqrt expression."""
215
+ return {"$sqrt": serialize_value(self.input)}
216
+
217
+
218
+ class PowExpr(ExpressionBase):
219
+ """
220
+ $pow expression operator - raises number to exponent.
221
+
222
+ Example:
223
+ >>> PowExpr(base=F("value"), exponent=2).model_dump()
224
+ {"$pow": ["$value", 2]}
225
+ """
226
+
227
+ base: Any
228
+ exponent: Any
229
+
230
+ @model_serializer
231
+ def serialize(self) -> dict[str, Any]:
232
+ """Serialize to MongoDB $pow expression."""
233
+ return {
234
+ "$pow": [
235
+ serialize_value(self.base),
236
+ serialize_value(self.exponent),
237
+ ]
238
+ }
239
+
240
+
241
+ class ExpExpr(ExpressionBase):
242
+ """
243
+ $exp expression operator - raises e to the specified exponent.
244
+
245
+ Example:
246
+ >>> ExpExpr(input=F("value")).model_dump()
247
+ {"$exp": "$value"}
248
+ """
249
+
250
+ input: Any
251
+
252
+ @model_serializer
253
+ def serialize(self) -> dict[str, Any]:
254
+ """Serialize to MongoDB $exp expression."""
255
+ return {"$exp": serialize_value(self.input)}
256
+
257
+
258
+ class LnExpr(ExpressionBase):
259
+ """
260
+ $ln expression operator - calculates natural logarithm.
261
+
262
+ Example:
263
+ >>> LnExpr(input=F("value")).model_dump()
264
+ {"$ln": "$value"}
265
+ """
266
+
267
+ input: Any
268
+
269
+ @model_serializer
270
+ def serialize(self) -> dict[str, Any]:
271
+ """Serialize to MongoDB $ln expression."""
272
+ return {"$ln": serialize_value(self.input)}
273
+
274
+
275
+ class Log10Expr(ExpressionBase):
276
+ """
277
+ $log10 expression operator - calculates log base 10.
278
+
279
+ Example:
280
+ >>> Log10Expr(input=F("value")).model_dump()
281
+ {"$log10": "$value"}
282
+ """
283
+
284
+ input: Any
285
+
286
+ @model_serializer
287
+ def serialize(self) -> dict[str, Any]:
288
+ """Serialize to MongoDB $log10 expression."""
289
+ return {"$log10": serialize_value(self.input)}
290
+
291
+
292
+ class LogExpr(ExpressionBase):
293
+ """
294
+ $log expression operator - calculates log with specified base.
295
+
296
+ Example:
297
+ >>> LogExpr(input=F("value"), base=2).model_dump()
298
+ {"$log": ["$value", 2]}
299
+ """
300
+
301
+ input: Any
302
+ base: Any
303
+
304
+ @model_serializer
305
+ def serialize(self) -> dict[str, Any]:
306
+ """Serialize to MongoDB $log expression."""
307
+ return {
308
+ "$log": [serialize_value(self.input), serialize_value(self.base)]
309
+ }
310
+
311
+
312
+ __all__ = [
313
+ "AddExpr",
314
+ "SubtractExpr",
315
+ "MultiplyExpr",
316
+ "DivideExpr",
317
+ "AbsExpr",
318
+ "ModExpr",
319
+ "CeilExpr",
320
+ "FloorExpr",
321
+ "RoundExpr",
322
+ "TruncExpr",
323
+ "SqrtExpr",
324
+ "PowExpr",
325
+ "ExpExpr",
326
+ "LnExpr",
327
+ "Log10Expr",
328
+ "LogExpr",
329
+ ]