@@ -1075,6 +1075,44 @@ def _make_match_rule(cls, options):
10751075
10761076 return {"$match" : match_options }
10771077
1078+ @classmethod
1079+ def _make_lookup_rule (cls , options ):
1080+ return {"$lookup" : options }
1081+
1082+ @classmethod
1083+ def _make_add_fields_rule (cls , options ):
1084+ add_fields_options = {}
1085+
1086+ for field , conditional in options .items ():
1087+ add_fields_options .update (
1088+ {field : cls ._process_conditional_expression (conditional )}
1089+ )
1090+
1091+ return {"$addFields" : add_fields_options }
1092+
1093+ @classmethod
1094+ def _process_conditional_expression (cls , expression ):
1095+ if isinstance (expression , dict ):
1096+ if_expression = expression ["if" ]
1097+
1098+ if isinstance (if_expression , dict ):
1099+ replaced = {}
1100+ for k , v in if_expression .items ():
1101+ new_k = k .replace ("__" , "$" )
1102+ replaced [new_k ] = v
1103+
1104+ if_expression = replaced
1105+
1106+ return {
1107+ "$cond" : {
1108+ "if" : if_expression ,
1109+ "then" : cls ._process_conditional_expression (expression ["then" ]),
1110+ "else" : cls ._process_conditional_expression (expression ["else" ]),
1111+ }
1112+ }
1113+
1114+ return expression
1115+
10781116 @classmethod
10791117 def _make_aggregate_rules (cls , aggregate ):
10801118 _aggregate_rules = []
@@ -1116,6 +1154,12 @@ def _make_aggregate_rules(cls, aggregate):
11161154 elif "match" in stage :
11171155 rule = cls ._make_match_rule (stage ["match" ])
11181156 _aggregate_rules .append (rule )
1157+ elif "lookup" in stage :
1158+ rule = cls ._make_lookup_rule (stage ["lookup" ])
1159+ _aggregate_rules .append (rule )
1160+ elif "add_fields" in stage :
1161+ rule = cls ._make_add_fields_rule (stage ["add_fields" ])
1162+ _aggregate_rules .append (rule )
11191163 else :
11201164 raise ERROR_REQUIRED_PARAMETER (
11211165 key = "aggregate.unwind or aggregate.group or "
@@ -1514,7 +1558,9 @@ def analyze(
15141558 sort = None ,
15151559 start = None ,
15161560 end = None ,
1561+ lookup = None ,
15171562 unwind = None ,
1563+ add_fields = None ,
15181564 date_field = "date" ,
15191565 date_field_format = "%Y-%m-%d" ,
15201566 reference_filter = None ,
@@ -1552,9 +1598,15 @@ def analyze(
15521598
15531599 aggregate = []
15541600
1601+ if lookup :
1602+ aggregate .append ({"lookup" : lookup })
1603+
15551604 if unwind :
15561605 aggregate .append ({"unwind" : unwind })
15571606
1607+ if add_fields :
1608+ aggregate .append ({"add_fields" : add_fields })
1609+
15581610 aggregate .append ({"group" : {"keys" : group_keys , "fields" : group_fields }})
15591611
15601612 query = {
0 commit comments