我有下一个型号:
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中编写了一个代码,它从DB中获取所有数据,将其放入dict然后根据需要进行排序,但它的工作速度太慢。
如何在数据库中按Departments
或list_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
答案 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