如何根据 ListField 中的项目数在数据库中进行排序?

How to make sorting in DB by the number of items in the ListField?

我有下一个型号:

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中写了一段代码,它从数据库中获取所有数据,将其放入dict中,然后根据需要进行排序,但是速度太慢了。

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

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

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

?

对于您的第一个请求,请使用 Umut Gunebakan 在他的评论中告诉您的注释。但是我确定 ListField

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

对于 desc order by,您只需添加符号“-”(减号)。 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)

如果有人需要原始查询:

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

的比率排序时
departments = DepartmentStats._get_collection().aggregate([
    {"$project": {
        "department_id": 1,
        "name": 1,
        "list_of_users": 1,
        "len_list_of_items": {"$divide": [{"$size": "$list_of_users"},
                                          {"$size": "$list_of_workstations"}]}
    }},
    {"$sort": {"len_list_of_items": -1}},
])