如何根据 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_users
和 list_of_workstations
是项目列表。
我在Python中写了一段代码,它从数据库中获取所有数据,将其放入dict中,然后根据需要进行排序,但是速度太慢了。
如何在数据库中按 list_of_users
或 list_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}},
])
我有下一个型号:
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_users
和 list_of_workstations
是项目列表。
我在Python中写了一段代码,它从数据库中获取所有数据,将其放入dict中,然后根据需要进行排序,但是速度太慢了。
如何在数据库中按 list_of_users
或 list_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}},
])