def get_form_submissions_grouped_by_field(xform, field, name=None): """Number of submissions grouped by field""" query = {} mongo_field = _encode_for_mongo(field) query[ParsedInstance.USERFORM_ID] =\ u'%s_%s' % (xform.user.username, xform.id_string) query[mongo_field] = {"$exists": True} # check if requested field a datetime str record = xform_instances.find_one(query, {mongo_field: 1}) if not record: raise ValueError(_(u"Field '%s' does not exist." % field)) group = {"count": {"$sum": 1}} group["_id"] = _get_id_for_type(record, mongo_field) field_name = field if name is None else name pipeline = [ { "$group": group }, { "$sort": {"_id": 1} }, { "$project": { field_name: "$_id", "count": 1 } } ] kargs = { 'query': query, 'pipeline': pipeline } records = ParsedInstance.mongo_aggregate(**kargs) # delete mongodb's _id field from records # TODO: is there an elegant way to do this? should we remove the field? for record in records: del record['_id'] return records