Skip to content

Mongo

MongoCollection (EntryCollection)

find(self, params)

Fetches results and indicates if more data is available.

Also gives the total number of data available in the absence of page_limit.

Parameters:

Name Type Description Default
params EntryListingQueryParams

entry listing URL query params

required

Returns:

Type Description
Tuple[List[Entry], int, bool, set]

(results, data_returned, more_data_available, fields)

Source code in optimade/server/entry_collections/mongo.py
def find(
    self, params: Union[EntryListingQueryParams, SingleEntryQueryParams]
) -> Tuple[List[EntryResource], int, bool, set]:
    criteria = self._parse_params(params)

    all_fields = criteria.pop("fields")
    if getattr(params, "response_fields", False):
        fields = set(params.response_fields.split(","))
        fields |= self.resource_mapper.get_required_fields()
    else:
        fields = all_fields.copy()

    results = []
    for doc in self.collection.find(**criteria):
        results.append(self.resource_cls(**self.resource_mapper.map_back(doc)))

    nresults_now = len(results)
    if isinstance(params, EntryListingQueryParams):
        criteria_nolimit = criteria.copy()
        criteria_nolimit.pop("limit", None)
        data_returned = self.count(**criteria_nolimit)
        more_data_available = nresults_now < data_returned
    else:
        # SingleEntryQueryParams, e.g., /structures/{entry_id}
        data_returned = nresults_now
        more_data_available = False
        if nresults_now > 1:
            raise HTTPException(
                status_code=404,
                detail=f"Instead of a single entry, {nresults_now} entries were found",
            )
        results = results[0] if results else None

    return results, data_returned, more_data_available, all_fields - fields