如何使用ListField中的项目数在DB中进行排序?

时间:2017-01-23 20:33:09

标签: django mongodb python-3.x django-rest-framework mongoengine

我有下一个型号:

class Departments(Document):
    _id = fields.ObjectIdField()
    name = fields.StringField(blank=True, null=True)
    department_id = fields.StringField(blank=True, null=True)  # Added
    list_of_users = fields.ListField(blank=True, null=True)
    list_of_workstations = fields.ListField(blank=True, null=True)

正如您所见,list_of_userslist_of_workstations是项目列表。

我在Python中编写了一个代码,它从DB中获取所有数据,将其放入dict然后根据需要进行排序,但它的工作速度太慢。

如何在数据库中按Departmentslist_of_users的长度或list_of_workstations的比例对数据list_of_users/list_of_workstations进行排序,例如:

departments = DepartmentStats.objects.order_by(len(list_of_users)).dsc

departments = DepartmentStats.objects.order_by(len(list_of_users)/len(list_of_workstations)).dsc

2 个答案:

答案 0 :(得分:0)

对于您的第一个请求,使用像Umut Gunebakan这样的注释在他的评论中告诉您。但我知道ListField上的Count()

departments = DepartmentStats.objects.all().annotate(num_list_users=Count('list_of_users')).order_by('-num_list_users')

对于desc订单,您只需添加标志' - ' (减去)。 https://docs.djangoproject.com/en/1.10/ref/models/querysets/#order-by

第二个请求将是:

departments = DepartmentStats.objects.all().annotate(user_per_workstation=(Count('list_of_users')/Count('list_of_workstations')).order_by('-user_per_workstation')

更新:(使用Mongoengine)

使用mongoengine,您需要获取项目频率并对结果进行排序: 检查documentation - futher aggregation

的这一部分
list_user_freqs = DepartmentStats.objects.item_frequencies('list_of_users', normalize=True)

from operator import itemgetter
list_user_freqs_sroted = sorted(list_user_freqs.items(), key=itemgetter(1), reverse=True)

答案 1 :(得分:0)

如果有人需要原始查询:

var text = "E" + val.TrimStart(new[] {'E'}).PadLeft(6, '0');

和案例,当结果必须按比例departments = DepartmentStats._get_collection().aggregate([ {"$project": { "department_id": 1, "name": 1, "list_of_users": 1, }}, {"$sort": {"list_of_users": -1}}, ])

排序时
list_of_users/list_of_workstations