コード例 #1
0
ファイル: find.py プロジェクト: nzsmith1/beanie
    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,
        )
コード例 #2
0
    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,
        )
コード例 #3
0
    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,
        )
コード例 #4
0
async def test_projection():
    projection = get_projection(DocumentTestModel)
    assert projection == {
        "_id": 1,
        "test_int": 1,
        "test_list": 1,
        "test_str": 1,
    }
コード例 #5
0
 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
コード例 #6
0
ファイル: find.py プロジェクト: jorants/beanie
 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,
     )
コード例 #7
0
ファイル: aggregation.py プロジェクト: roman-right/beanie
 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
コード例 #8
0
ファイル: find.py プロジェクト: nzsmith1/beanie
 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,
         }
     )
コード例 #9
0
ファイル: aggregation.py プロジェクト: roman-right/beanie
 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,
     })
コード例 #10
0
ファイル: find.py プロジェクト: jorants/beanie
 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)
コード例 #11
0
ファイル: find.py プロジェクト: flyinactor91/beanie
 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))
コード例 #12
0
ファイル: find.py プロジェクト: nzsmith1/beanie
 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,
     )