繁体   English   中英

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

[英]How quick sort huge mongoengine QuerySet in python

我需要对整个集合进行区分大小写和变音的排序,而mongoengine无法做到,因为mongodb仅具有区分大小写的排序。

所以我有一个想法。 抓取collection中的所有条目,然后在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分钟,这是很长的延迟。 有人可以帮助收集到这么多条目的人吗?

您只需要按一个字段排序(此示例为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 querySet 在此块中,您将从查询集中获得项目。 您可以尝试使用for obj in list(querySet)一次获取所有数据,但是我不相信它确实可以提高性能。

最好的方法是使用小写字母添加其他字段。 您也可以为此尝试map reduce。 我找不到如何使用聚合project执行此操作。

同样,不区分大小写的索引将位于mongo 2.5.w(可能在11月底)上,请参见https://jira.mongodb.org/browse/SERVER-90

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM