在python中对巨大的mongoengine QuerySet进行排序有多快

2024-09-30 06:13:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要对整个集合进行区分大小写的排序,这是mongoengine做不到的,因为mongodb只有区分大小写的排序。在

所以我有个办法。获取集合中的所有条目,然后在python中执行我自己的unicode不区分大小写的排序。但是我的藏书量非常大,所以延迟太久也有问题。有没有办法,怎么做得更快?在

def initMongoengineData(model, criteria, only):
    if model == None:
        return

    print "-- starting DB query"
    print datetime.datetime.now()

    querySet = model.objects(**criteria).only(*only)

    print "-- data loaded"
    print datetime.datetime.now()

    return mongoengineQuerySetToList(querySet)

def mongoengineQuerySetToList(querySet):
    queryList = []
    dict = {}
    objDict = None
    objCounter = 0
    for obj in querySet:
        objCounter += 1
        dict = {}
        objDict = obj.to_mongo()
        for key in objDict:
            dict[key] = objDict[key]
        queryList.append(dict)

    print "-- structure for sorting is ready"
    print datetime.datetime.now()
    print "-- number of objects:"
    print objCounter
    queryList.sort(key=lambda x: x['surname'].lower())
    print "-- structure is sorted"
    print datetime.datetime.now()

    return queryList


model = Players  # mongoengine Document
criteria = {} 
only = ['surname']
datalist = initMongoengineData(model, criteria, only)

输出:

^{pr2}$

之后的数据加载和排序非常快,但是准备排序结构大约需要1分钟这是非常长的延迟。有人能帮助如何更快地完成这项工作吗?在


Tags: keyonlydatetimemodelreturn排序nowdict
1条回答
网友
1楼 · 发布于 2024-09-30 06:13:31

您只需要按一个字段排序(surname在本例中)。在

所以使用mongoengine model.objects(**criteria).only(*only).order_by('+surname')进行基排序(排序)请参见http://docs.mongoengine.org/en/latest/guide/defining-documents.html#ordering。在

但是如果你真的需要不区分大小写的排序,没有简单的方法。在

在您的代码中,最慢的块是for obj in querySet。在这个块中,您可以从查询集中获取项。您可以尝试使用for obj in list(querySet)一次获取所有数据,但我不认为它真的能提高性能。在

最好的方法是用小写添加附加字段。你也可以试试map reduce。我不知道如何用aggregation来实现这一点。在

另外,不区分大小写的索引也将在mongo2.5.w上(可能在11月底)见https://jira.mongodb.org/browse/SERVER-90。在

相关问题 更多 >

    热门问题