0

mongodbには大文字と小文字を区別するソートしかないため、mongoengineができないことを、コレクション全体で大文字と小文字を区別してソートする必要があります。

だから私はそれを行う方法を考えています。コレクション内のすべてのエントリを取得し、Python で独自のユニコードの大文字と小文字を区別しない並べ替えを行います。しかし、私のコレクションは非常に巨大であるため、遅延が長くなるという問題があります。それをより速く行う方法はありますか?

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 分かかり、非常に長い遅延です。コレクション内の非常に多くのエントリでこれをより速く行う方法を誰かが助けることができますか?

4

1 に答える 1

1

1 つのフィールドだけで並べ替える必要があります (surnameこの例の場合)。

したがって、mongoengine を使用した基本ソート (順序付け) については、http://docs.mongoengine.org/en/latest/guide/defining-documents.html#ordering を参照しmodel.objects(**criteria).only(*only).order_by('+surname')ください。

しかし、大文字と小文字を区別しない並べ替えが本当に必要な場合、簡単な方法はありません。

あなたのコードには、最も遅いブロックがありfor obj in querySetます。このブロックでは、クエリ セットからアイテムを取得します。すべてのデータを一度に取得するために使用を試みることはできますがfor obj in list(querySet)、実際にパフォーマンスが向上するとは思えません。

最善の方法は、小文字のフィールドを追加することです。このために map reduce を試すこともできます。agregation でこれを行う方法が見つかりませんproject

また、大文字と小文字を区別しないインデックスは、mongo 2.5.w (おそらく 11 月末) で提供されます。 https://jira.mongodb.org/browse/SERVER-90を参照してください。

于 2013-08-25T06:01:32.000 に答える