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