Closed
Description
I think _perform_aggregation could be modified with $facet to return a count
value with the aggregation results. I know limitaions says that it's not the intended behaviour, however, I think it would be beneficial.
Here's how I would consider implementing:
def _perform_aggregation(resource, pipeline, options):
...
paginated_results = []
if req.max_results > 1:
limit = {"$limit": req.max_results}
skip = {"$skip": (req.page - 1) * req.max_results}
paginated_results.append(skip)
paginated_results.append(limit)
else:
# sub-pipeline in $facet stage cannot be empty
skip = {"$skip": 0}
paginated_results.append(skip)
facet_pipelines = {}
facet_pipelines["paginated_results"] = paginated_results
facet_pipelines["total_count"] = [{"$count": "count"}]
facet = {"$facet":facet_pipelines}
req_pipeline.append(facet)
getattr(app, "before_aggregation")(resource, req_pipeline)
cursor = app.data.aggregate(resource, req_pipeline, options).next()
for document in cursor['paginated_results']:
documents.append(document)
getattr(app, "after_aggregation")(resource, documents)
response[config.ITEMS] = documents
# add pagination info
if config.DOMAIN[resource]["pagination"]:
count = cursor['total_count'][0]['count']
response[config.META] = _meta_links(req, count)
return response, None, None, 200, []
This modification would change the aggregate pipeline considerably, so maybe a config
variable could be used to control this behaviour for those already hooking into "before_aggregation".
Am I missing anything obvious? Should I try implementing this and submitting a PR?