@@ -207,7 +207,7 @@ def create_nested_pipeline(model: Type[BaseModel], prefix="", pipeline=None):
207
207
"timestamp" : "$timestamp" ,
208
208
}
209
209
210
- for field_name , field_type in model .__fields__ .items ():
210
+ for field_name , _ in model .__fields__ .items ():
211
211
if field_name == "timestamp" :
212
212
continue
213
213
lookup_field = (
@@ -220,32 +220,17 @@ def create_nested_pipeline(model: Type[BaseModel], prefix="", pipeline=None):
220
220
unit_field_name = f"{ prefix } { mongo_field } _unit"
221
221
pipeline ["unit" ] = f"${ unit_field_name } "
222
222
match_conditions [unit_field_name ] = {"$exists" : True }
223
+ elif field_name in nested_fields :
224
+ nested_model = nested_fields [field_name ]
225
+ nested_prefix = f"{ full_mongo_field_name } ."
226
+ nested_pipeline , nested_match = create_nested_pipeline (nested_model , nested_prefix )
227
+ pipeline [field_name ] = nested_pipeline
228
+ for k , v in nested_match .items ():
229
+ match_conditions [f"{ nested_prefix } { k } " ] = v
223
230
else :
224
231
pipeline [field_name ] = f"${ full_mongo_field_name } "
225
232
match_conditions [full_mongo_field_name ] = {"$exists" : True }
226
233
227
- if field_name in nested_fields :
228
- if get_origin (field_type .type_ ) is List :
229
- nested_pipeline , nested_match = create_nested_pipeline (
230
- nested_fields [field_name ], "" # Empty prefix for list items
231
- )
232
- pipeline [field_name ] = {
233
- "$map" : {
234
- "input" : f"${ full_mongo_field_name } " ,
235
- "as" : "item" ,
236
- "in" : {
237
- k : f"$$item.{ v .replace ('$' , '' )} " for k , v in nested_pipeline .items ()
238
- },
239
- }
240
- }
241
- match_conditions [full_mongo_field_name ] = {"$exists" : True , "$ne" : []}
242
- else :
243
- nested_pipeline , nested_match = create_nested_pipeline (
244
- nested_fields [field_name ], f"{ full_mongo_field_name } ." , pipeline
245
- )
246
- pipeline [field_name ] = nested_pipeline
247
- match_conditions .update ({f"{ field_name } .{ k } " : v for k , v in nested_match .items ()})
248
-
249
234
logger .debug (f"Field: { field_name } , Full mongo field name: { full_mongo_field_name } " )
250
235
logger .debug (f"Resulting pipeline part: { pipeline [field_name ]} " )
251
236
@@ -255,11 +240,11 @@ def create_nested_pipeline(model: Type[BaseModel], prefix="", pipeline=None):
255
240
256
241
def create_model_instance (model : Type [BaseModel ], data : dict , target_unit : Optional [str ] = None ):
257
242
nested_fields = get_nested_fields (model )
243
+ instance_data = {}
258
244
259
- for field_name , _ in model .__fields__ .items ():
245
+ for field_name , field in model .__fields__ .items ():
260
246
if field_name == "timestamp" :
261
- continue
262
- if field_name in nested_fields :
247
+ instance_data [field_name ] = data .get (field_name )
263
248
continue
264
249
265
250
lookup_field = (
@@ -270,41 +255,24 @@ def create_model_instance(model: Type[BaseModel], data: dict, target_unit: Optio
270
255
# Special handling for the unit field
271
256
if field_name == "unit" :
272
257
unit_field = f"{ mongo_field } _unit"
273
- if unit_field in data :
274
- data [field_name ] = data [unit_field ]
275
- continue
276
-
277
- # Handle temperature unit conversion if applicable
278
- if mongo_field in data :
279
- data [field_name ] = data [mongo_field ]
280
- elif field_name in data :
281
- # If the field_name exists in data, use it
282
- data [field_name ] = data [field_name ]
283
- elif field_name .lower () in data :
284
- # If the field_name (lowercase) exists in data, use it
285
- data [field_name ] = data [field_name .lower ()]
286
- else :
287
- # If neither the mongo_field nor the field_name exists, log an error
288
- logger .error (
289
- f"Field '{ mongo_field } ' or '{ field_name } ' not found in data for model { model .__name__ } "
290
- )
291
- logger .error (f"Available fields in data: { list (data .keys ())} " )
292
- # You might want to set a default value or raise an exception here
293
-
294
- for field_name , nested_model in nested_fields .items ():
295
- if field_name in data :
296
- if isinstance (data [field_name ], list ):
297
- data [field_name ] = [
258
+ instance_data [field_name ] = data .get (unit_field )
259
+ elif field_name in nested_fields :
260
+ nested_model = nested_fields [field_name ]
261
+ if isinstance (field .type_ , List ):
262
+ instance_data [field_name ] = [
298
263
create_model_instance (nested_model , item , target_unit )
299
- for item in data [ field_name ]
264
+ for item in data . get ( field_name , [])
300
265
]
301
266
else :
302
- data [field_name ] = create_model_instance (
303
- nested_model , data [field_name ], target_unit
267
+ nested_data = data .get (field_name , {})
268
+ instance_data [field_name ] = create_model_instance (
269
+ nested_model , nested_data , target_unit
304
270
)
271
+ else :
272
+ instance_data [field_name ] = data .get (mongo_field ) or data .get (field_name )
305
273
306
- logger .debug (f"Creating instance of { model .__name__ } with data: { data } " )
307
- result = model (** data )
274
+ logger .debug (f"Creating instance of { model .__name__ } with data: { instance_data } " )
275
+ result = model (** instance_data )
308
276
if isinstance (result , Temperature ) and target_unit :
309
277
convert_temperature (result , target_unit )
310
278
return result
0 commit comments