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