def motor_cursor(self): if self.fetch_links: aggregation_pipeline: List[ Dict[str, Any] ] = construct_lookup_queries(self.document_model) sort_pipeline = { "$sort": {i[0]: i[1] for i in self.sort_expressions} } if sort_pipeline["$sort"]: aggregation_pipeline.append(sort_pipeline) if self.skip_number != 0: aggregation_pipeline.append({"$skip": self.skip_number}) if self.limit_number != 0: aggregation_pipeline.append({"$limit": self.limit_number}) aggregation_pipeline.append({"$match": self.get_filter_query()}) aggregation_pipeline.append( {"$project": get_projection(self.projection_model)} ) return self.document_model.get_motor_collection().aggregate( aggregation_pipeline, session=self.session ) return self.document_model.get_motor_collection().find( filter=self.get_filter_query(), sort=self.sort_expressions, projection=get_projection(self.projection_model), skip=self.skip_number, limit=self.limit_number, session=self.session, )
async def _find_one(self): if self.document_model.get_link_fields() is not None: for i, query in enumerate(self.find_expressions): self.find_expressions[i] = convert_ids( query, doc=self.document_model, fetch_links=self.fetch_links, ) if self.fetch_links: result = await self.document_model.find( *self.find_expressions, session=self.session, fetch_links=self.fetch_links, **self.pymongo_kwargs, ).to_list(length=1) if result: return result[0] else: return None return await self.document_model.get_motor_collection().find_one( filter=self.get_filter_query(), projection=get_projection(self.projection_model), session=self.session, **self.pymongo_kwargs, )
def motor_cursor(self): if self.document_model.get_link_fields() is not None: for i, query in enumerate(self.find_expressions): self.find_expressions[i] = convert_ids( query, doc=self.document_model, fetch_links=self.fetch_links, ) if self.fetch_links: aggregation_pipeline: List[Dict[str, Any]] = construct_lookup_queries( self.document_model) aggregation_pipeline.append({"$match": self.get_filter_query()}) sort_pipeline = { "$sort": {i[0]: i[1] for i in self.sort_expressions} } if sort_pipeline["$sort"]: aggregation_pipeline.append(sort_pipeline) if self.skip_number != 0: aggregation_pipeline.append({"$skip": self.skip_number}) if self.limit_number != 0: aggregation_pipeline.append({"$limit": self.limit_number}) projection = get_projection(self.projection_model) if projection is not None: aggregation_pipeline.append({"$project": projection}) return self.document_model.get_motor_collection().aggregate( aggregation_pipeline, session=self.session, **self.pymongo_kwargs, ) return self.document_model.get_motor_collection().find( filter=self.get_filter_query(), sort=self.sort_expressions, projection=get_projection(self.projection_model), skip=self.skip_number, limit=self.limit_number, session=self.session, **self.pymongo_kwargs, )
async def test_projection(): projection = get_projection(DocumentTestModel) assert projection == { "_id": 1, "test_int": 1, "test_list": 1, "test_str": 1, }
def get_aggregation_pipeline(self, ) -> List[Mapping[str, Any]]: match_pipeline: List[Mapping[str, Any]] = ([{ "$match": self.find_query }] if self.find_query else []) projection_pipeline: List[Mapping[str, Any]] = ([{ "$project": get_projection(self.projection_model) }] if self.projection_model else []) return match_pipeline + self.aggregation_pipeline + projection_pipeline
def motor_cursor(self): return self.document_model.get_motor_collection().find( filter=self.get_filter_query(), sort=self.sort_expressions, projection=get_projection(self.projection_model), skip=self.skip_number, limit=self.limit_number, session=self.session, )
def get_aggregation_pipeline(self, ) -> List[Mapping[str, Any]]: match_pipeline: List[Mapping[str, Any]] = ([{ "$match": self.find_query }] if self.find_query else []) projection_pipeline: List[Mapping[str, Any]] = [] if self.projection_model: projection = get_projection(self.projection_model) if projection is not None: projection_pipeline = [{"$project": projection}] return match_pipeline + self.aggregation_pipeline + projection_pipeline
def _cache_key(self) -> str: return LRUCache.create_key( { "type": "FindMany", "filter": self.get_filter_query(), "sort": self.sort_expressions, "projection": get_projection(self.projection_model), "skip": self.skip_number, "limit": self.limit_number, } )
def _cache_key(self) -> str: return LRUCache.create_key({ "type": "Aggregation", "filter": self.find_query, "pipeline": self.aggregation_pipeline, "projection": get_projection(self.projection_model) if self.projection_model else None, })
def __await__(self): """ Run the query :return: BaseModel """ projection = get_projection(self.projection_model) document: Dict[str, Any] = ( yield from self.document_model.get_motor_collection().find_one( filter=self.get_filter_query(), projection=projection, session=self.session, )) if document is None: return None return self.projection_model.parse_obj(document)
def __await__( self, ) -> Generator[Coroutine, Any, Optional[FindQueryResultType]]: """ Run the query :return: BaseModel """ projection = get_projection(self.projection_model) document: Dict[str, Any] = ( yield from self.document_model.get_motor_collection().find_one( filter=self.get_filter_query(), projection=projection, session=self.session, )) if document is None: return None return cast(FindQueryResultType, parse_obj(self.projection_model, document))
async def _find_one(self): if self.fetch_links: lookup_queries = construct_lookup_queries(self.document_model) result = ( await self.document_model.find(*self.find_expressions) .aggregate( aggregation_pipeline=lookup_queries, projection_model=self.projection_model, session=self.session, ) .to_list(length=1) ) if result: return result[0] else: return None return await self.document_model.get_motor_collection().find_one( filter=self.get_filter_query(), projection=get_projection(self.projection_model), session=self.session, )