如何在python中快速排序巨大的mongoengine QuerySet

时间:2013-08-24 14:56:48

标签: python mongodb sorting python-2.7 mongoengine

我需要对整个集合进行make case和diacritic敏感排序,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)

输出:

-- starting DB query
2013-08-24 16:45:57.721000
-- data loaded
2013-08-24 16:45:57.721000
-- structure for sorting is ready
2013-08-24 16:46:52.257000
-- number of objects:
82668
-- structure is sorted
2013-08-24 16:46:52.493000

之后的数据加载和排序非常快,但准备排序结构大约需要 1分钟非常长的延迟。任何人都可以通过集合中的这么多条目帮助如何更快地完成这项工作吗?

1 个答案:

答案 0 :(得分:1)

您只需要按一个字段进行排序(此示例为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。我无法通过agregation project找到你如何做到这一点。

同样情况下的insensetive索引将在mongo 2.5.w(可能是11月底)上见https://jira.mongodb.org/browse/SERVER-90